【问题标题】:Lazy loading in HibernateHibernate 中的延迟加载
【发布时间】:2010-02-01 20:19:18
【问题描述】:

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

org.hibernate.LazyInitializationException: 延迟初始化角色集合失败:common.model.impl.User.groups,没有会话或会话已关闭

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

有谁知道一旦原始会话消失,我可以如何解决惰性集合?

谢谢...

--史蒂夫

【问题讨论】:

  • 你在stackoverflow中搜索过吗?搜索提供了很多线索
  • 其实我在StackOverflow等地方确实搜索过。我发现的似乎并没有给出适用于我的问题的答案。如果您有一些我可能错过的特定帖子,请将其发布,以便我看看是否有帮助。

标签: java hibernate session orm lazy-loading


【解决方案1】:

三个选项:

  1. 每当您的收藏即将与当前会话断开连接时,请在您的收藏上调用Hibernate.initialize(..)

  2. 将集合声明为FetchType.EAGER

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

【讨论】:

    【解决方案2】:

    在访问未初始化的集合或其他代理之前,您需要使用merge()lock() 将先前加载的对象附加到新的Session。我不知道您是如何做到这一点的,但事实是当您尝试检索他的groups 时,您的User 仍然分离。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-25
        • 2018-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 2011-01-12
        • 1970-01-01
        相关资源
        最近更新 更多