Я склонен инициализировать коллекции на уровне сервиса, где я также поддерживаю обработку транзакций. Таким образом, у меня может быть метод в BaseDAO, который позволяет мне инициализировать любую коллекцию любой сущности в моих проектах, используя отражение, передавая имена коллекций в метод, который должен быть извлечен с нетерпением (инициализирован):
public <T extends Object> T getEntity(Class<T> clazz,long id,String[] collectionsToBeInitialized){
T entity=(T) this.getCurrentSession().createCriteria(clazz).add(Restrictions.idEq(id)).setFetchMode(collectionsToBeInitialized[0], FetchMode.JOIN).uniqueResult();
int length=collectionsToBeInitialized.length;
for (int idx=1;idx<length;idx++){
String collectionName=collectionsToBeInitialized[idx];
try {
Method m = clazz.getMethod("get" + collectionName.substring(0, 1).toUpperCase() + collectionName.substring(1),(Class<T>) null);
Hibernate.initialize(m.invoke(entity,(Object[]) null));
} catch (NoSuchMethodException e) {
LOG.error("Could not initialize collection " + collectionName + " of class Event", e);
} catch (InvocationTargetException e) {
LOG.error("Could not initialize collection " + collectionName + " of class Event", e);
} catch (IllegalAccessException e) {
LOG.error("Could not initialize collection " + collectionName + " of class Event", e);
}
}
return entity;
}
тогда вы можете инициализировать любую коллекцию из сервисного уровня, используя этот метод:
MyEntity ent=getEntity(MyEntity.class,id,new String[]{"collection1","collection2"});
Более подробный пример:
http://objecthunter.congrace.de/tinybo/blog/articles/69