代码之家  ›  专栏  ›  技术社区  ›  Steve

休眠时延迟加载

  •  2
  • Steve  · 技术社区  · 16 年前

    我的Java Web应用程序使用Hibernate来执行ORM。在我的一些对象中,我使用延迟加载来避免在绝对需要数据之前获取数据。问题是我在会话中加载了初始对象,然后该会话被销毁。稍后,当我尝试解决对象中延迟加载的集合时,会出现以下错误:

    org.hibernate.lazyinitializationException:未能延迟初始化角色集合:common.model.impl.user.groups,未关闭任何会话或会话

    我尝试将新会话与集合关联,然后进行解析,但结果相同。

    有人知道在原始会话结束后我如何解决懒惰的集合吗?

    谢谢。。。

    ——史提夫

    3 回复  |  直到 15 年前
        1
  •  2
  •   Bozho    16 年前

    三种选择:

    1. 呼叫 Hibernate.initialize(..) 在您的集合上,每当它将要断开与当前会话的连接时

    2. 将集合声明为 FetchType.EAGER

    3. merge(..) 您的用户对象返回到新会话

        2
  •  2
  •   Pascal Thivent    16 年前

    在访问未初始化的集合或其他代理之前,需要将以前加载的对象附加到新的 Session 具有 merge() lock() . 我不知道你是怎么办到的,但事实是你 User 当你试图找回他的时候 groups .

        3
  •  1
  •   Gordon    15 年前

    您有几个选项,但主要问题是您需要扩展会话,或者将对象重新附加到会话。

    帕斯卡提供了如何将对象重新附加到新会话的答案。

    另一种选择是更改处理会话的方式。在我们的应用程序中,我们还使用Spring,让Spring为我们管理Hibernate的会话。这为解决方案提供了很好的一部分,但您仍然需要不时地重新附加对象,这只是在Web环境中使用Hibernate的一部分。