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