Java Hibernate中的延迟加载
我的Java Web应用程序使用Hibernate执行ORM。在我的一些对象中,我使用延迟加载来避免获取数据,直到我完全需要它为止。问题是我在会话中加载初始对象,然后该会话被销毁。当我稍后尝试解析对象中的延迟加载集合时,出现以下错误: org.hibernate.LazyInitializationException:未能延迟初始化角色集合:common.model.impl.User.groups,未关闭任何会话或会话 我尝试将一个新会话与集合相关联,然后进行解析,但结果相同 有人知道我如何在原始会话结束后解析惰性集合吗 谢谢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,未关闭任何会话或会话 我尝试将一个新会话与集合相关联,然后进行解析,但结果相同 有人知道我如何在
--Steve在访问未初始化的集合或其他代理之前,您需要使用
merge()
或lock()
将以前加载的对象附加到新的会话。我不知道您是如何做到这一点的,但事实是,您的用户
在尝试检索其组时仍然处于分离状态 三个选项:
调用Hibernate.initialize(..)
,每当您的集合即将与当前会话断开连接时,对其进行初始化
将集合声明为FetchType.EAGER
合并(…)
将您的用户对象返回到新会话
您有几个选项,但主要问题是您需要扩展会话,或者将对象重新附加到会话
Pascal提供了如何将对象重新连接到新会话的答案
另一个选项是更改处理会话的方式。在我们的应用程序中,我们还使用Spring,并让Spring为我们管理Hibernate的会话。这提供了解决方案的一个很好的部分,但您仍然需要不时地重新附加对象,这只是您在web环境中使用Hibernate的一部分。您确实在stackoverflow中搜索过吗?搜索提供了大量的俱乐部事实上,我在StackOverflow和其他地方搜索过。我的发现似乎并没有给出一个适用于我的问题的答案。如果你有一些我可能错过的特定帖子,就把它贴出来,这样我可以看看它是否有用。