I faced problem with optimization of Hibernate fetching. For instance, I have a class User with included Set of permissions (many-to-many). Sometimes I need user with them, sometimes w/o. If I used Lazy loading I'd get my permissions loaded w/ extra SQL query. But I don't want it. I need to load all at one time i.e. using outer-join.
I've got my solution for now. The solution is to have two different classes for uset w/ permissions and w/o them. Both these classes are mapped to one table. If I need full user I will use FullUser class. If I don't I'll use User class.
By using this solution I'll get SQL optimization but also get more comlicated code. My DAO will have several similar methods for loading user like: loadFullUser() and loadUser(). Also these classes would implement one interface to unify their usage.
But it all doesn't look good to me.
Any suggestion is appreciated
Use a single class mapped to the table, skip the idea of multiple classes since it will give you an major headake later on for sure!
Instead, pass a parameter into your dao's fetch method toggling if you want a lazy fetch or not. Depending on the flag, you write a HQL statement for fetching the user using the "fetch" keyword (see the Hibernate docs) in the outer join with the permissions in the case you need a full fetch, and otherwise you omit the keyword (rendering a lazy fetch)
It's of use for me.