Java Hibernate中的延迟加载

Java Hibernate中的延迟加载,java,hibernate,session,orm,lazy-loading,Java,Hibernate,Session,Orm,Lazy Loading,我的Java Web应用程序使用Hibernate执行ORM。在我的一些对象中,我使用延迟加载来避免获取数据,直到我完全需要它为止。问题是我在会话中加载初始对象,然后该会话被销毁。当我稍后尝试解析对象中的延迟加载集合时,出现以下错误: org.hibernate.LazyInitializationException:未能延迟初始化角色集合:common.model.impl.User.groups,未关闭任何会话或会话 我尝试将一个新会话与集合相关联,然后进行解析,但结果相同 有人知道我如何在

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

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

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

有人知道我如何在原始会话结束后解析惰性集合吗

谢谢


--Steve

在访问未初始化的集合或其他代理之前,您需要使用
merge()
lock()
将以前加载的对象附加到新的
会话。我不知道您是如何做到这一点的,但事实是,您的
用户
在尝试检索其
组时仍然处于分离状态

三个选项:

  • 调用
    Hibernate.initialize(..)
    ,每当您的集合即将与当前会话断开连接时,对其进行初始化

  • 将集合声明为
    FetchType.EAGER

  • 合并(…)
    将您的用户对象返回到新会话


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

    Pascal提供了如何将对象重新连接到新会话的答案


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

    您确实在stackoverflow中搜索过吗?搜索提供了大量的俱乐部事实上,我在StackOverflow和其他地方搜索过。我的发现似乎并没有给出一个适用于我的问题的答案。如果你有一些我可能错过的特定帖子,就把它贴出来,这样我可以看看它是否有用。