The most important thing is to make sure that proxies are enabled for all classes. This is done on a class-by-class basis with <class ... lazy="true">.
If you want to override this for some associations you can specify <many-to-one ... fetch="join">. Hibernate will use a single query with join statements to also load the associated objects.
You may also consider using the second-level cache.
A lot of information about this can be found in the Hibernate documentation:
http://www.hibernate.org/hib_docs/v3/re ... rmance.htm
It is kind of hard to answer questions about optimization without knowing anything about the data model, use cases, etc. Optimizing one use case may turn out to be very bad for something else. It is very often a matter of trying to find an acceptable average performance.