可以使用 Hibernate.initialize(parent.getCollection()) 加载惰性集合,但需要将父对象附加到活动会话。
此解决方案采用父实体和延迟加载字段的名称,并返回完全加载集合的实体。
不幸的是,由于父需要重新附加到新打开的会话,我不能使用对惰性集合的引用,因为这将引用实体的分离版本;因此 fieldName 和反射。出于同样的原因,这必须返回附加的父实体。
所以在OP场景下,可以在用户选择查看惰性集合时进行这个调用:
Parent parentWithChildren = dao.initialize(parent,"lazyCollectionName");
方法:
public Entity initialize(Entity detachedParent,String fieldName) {
// ...open a hibernate session...
// reattaches parent to session
Entity reattachedParent = (Entity) session.merge(detachedParent);
// get the field from the entity and initialize it
Field fieldToInitialize = detachedParent.getClass().getDeclaredField(fieldName);
fieldToInitialize.setAccessible(true);
Object objectToInitialize = fieldToInitialize.get(reattachedParent);
Hibernate.initialize(objectToInitialize);
return reattachedParent;
}