我的Java Web应用程序使用Hibernate来执行ORM。在我的一些对象中,我使用延迟加载来避免获取数据,直到我绝对需要它。问题是我在会话中加载了初始对象,然后该会话被销毁。当我稍后尝试解析对象中的延迟加载集合时,我收到以下错误:
org.hibernate.LazyInitializationException:懒得初始化角色集合:common.model.impl.User.groups,没有关闭会话或会话
我尝试将新会话与集合相关联然后解析,但这会产生相同的结果。
有没有人知道如果原始会话消失后我如何解决延迟收藏?
...谢谢
- 史蒂夫
答案 0 :(得分:2)
在访问未初始化的集合或其他代理之前,您需要将以前加载的对象附加到Session
或merge()
的新lock()
。我不知道你是如何在你的情况下做到这一点的,但事实是当你试图找回他的User
时你的groups
仍然是分离的。
答案 1 :(得分:2)
三个选项:
在您的集合即将与当前会话断开连接时调用Hibernate.initialize(..)
将集合声明为FetchType.EAGER
merge(..)
您的用户对象返回新会话
答案 2 :(得分:1)
您有几个选项,但主要问题是您需要扩展会话,或者将对象重新附加到会话中。
Pascal提供了关于如何将对象重新附加到新会话的答案。
另一个选择是更改处理会话的方式。在我们的应用程序中,我们也使用Spring,让Spring为我们管理Hibernate的会话。这提供了解决方案的很大一部分,但您仍然需要不时地重新附加对象,这只是您在Web环境中使用Hibernate的方式的一部分。