首页 文章

在Hibernate中加载延迟

提问于
浏览
2

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

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

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

一旦原始会话消失,有谁知道如何解决懒惰的集合?

谢谢...

--Steve

3 回答

  • 2

    三种选择:

    当你的集合即将与当前会话断开连接时,

    • 就会调用 Hibernate.initialize(..)

    • 将集合声明为 FetchType.EAGER

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

  • 1

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

  • 2

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

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

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

相关问题