2010-02-01 115 views
2

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

org.hibernate.LazyInitializationException:无法懒惰地初始化角色集合:common.model.impl.User.groups,没有会话或会话被关闭

我试着将一个新的会话与集合相关联然后解析,但是这给出了相同的结果。

有没有人知道我可以解决懒惰的集合,一旦原来的会议不见了?

谢谢...

--Steve

+1

您是否在stackoverflow中搜索?搜索给出了很多线索 – Salandur 2010-02-01 20:46:51

+0

其实,我在StackOverflow和其他地方搜索过。我发现似乎没有给出适用于我的问题的答案。如果您有一些我可能错过的特定帖子,请发帖,以便我看看它是否有帮助。 – Steve 2010-02-02 12:34:42

回答

2

三个选项:

  1. 在您的收藏电话Hibernate.initialize(..)时,它即将从当前会话

  2. 断开连接声明集合作为FetchType.EAGER

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

2

访问未初始化的集合或代理之前,您需要到以前装载的对象附加到一个新的Sessionmerge()lock()。我不知道你是如何做到这一点的,但事实是,当你试图检索他的groups时,你的User仍然分离。

1

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

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

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