在Hibernate中加载延迟

时间:2010-02-01 20:19:18

标签: java hibernate session orm lazy-loading

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

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

我尝试将新会话与集合相关联然后解析,但这会产生相同的结果。

有没有人知道如果原始会话消失后我如何解决延迟收藏?

...谢谢

- 史蒂夫

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

三个选项:

  1. 在您的集合即将与当前会话断开连接时调用Hibernate.initialize(..)

  2. 将集合声明为FetchType.EAGER

  3. merge(..)您的用户对象返回新会话

答案 2 :(得分:1)

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

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

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