Pau*_*son 8 java hibernate lazy-loading
考虑这种情况:
加载此系列的方法/最佳方式是什么?
谢谢.
可以使用Hibernate.initialize(parent.getCollection())加载延迟集合,但父对象需要附加到活动会话.
此解决方案获取父实体和延迟加载字段的名称,并返回完全加载集合的实体.
不幸的是,由于父需要重新连接到新打开的会话,我不能使用对延迟集合的引用,因为这将引用实体的分离版本; 因此fieldName和反射.出于同样的原因,这必须返回附加的父实体.
因此,在OP场景中,当用户选择查看延迟集合时,可以进行此调用:
Parent parentWithChildren = dao.initialize(parent,"lazyCollectionName");
Run Code Online (Sandbox Code Playgroud)
方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
我正在对用户正在查看的内容做出一些假设,但似乎您只想在用户已经查看过父级并且确实想查看子级时检索子级。
为什么不尝试打开一个新会话并由父母获取孩子呢?类似的东西......
criteria = session.createCriteria(Child.class);
criteria.add(Restrictions.eq("parent", parent));
List<Child> children = criteria.list();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12496 次 |
| 最近记录: |