gpt4 book ai didi

java - 如何在 session 关闭后使用 hibernate 访问延迟加载的字段?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:26 28 4
gpt4 key购买 nike

考虑这个场景:

  • 我已经通过 hibernate 加载了父实体
  • Parent 包含一个 Children 的集合,该集合很大且延迟加载
  • 当用户查看父数据时,初始加载后 hibernate session 关闭
  • 用户可以选择查看lazy Children Collection 的内容
  • 我现在想加载那个集合

加载此集合的方式/最佳方式是什么?

  • 假设 session-in-view 不是一个选项,因为只有在用户查看了 Parent 并决定查看 Children 之后才会获取 Children 集合。
  • 这是一项可通过基于 Web 和桌面的客户端远程访问的服务。

谢谢。

最佳答案

惰性集合可以使用 Hibernate.initialize(parent.getCollection()) 加载,除了父对象需要附加到 Activity session 。

此解决方案采用父实体和延迟加载字段的名称,并返回集合已完全加载的实体。

不幸的是,由于父项需要重新附加到新打开的 session ,我不能使用对惰性集合的引用,因为这会引用实体的分离版本;因此 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;
}

关于java - 如何在 session 关闭后使用 hibernate 访问延迟加载的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1069310/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com