【问题标题】:lazyinitializationexception when session is not closed会话未关闭时的延迟初始化异常
【发布时间】:2015-01-26 00:56:40
【问题描述】:

我在我的对象中使用 Hibernate,即使会话没有关闭也会出现延迟初始化异常。

这里是问题对象的关系。有 3 个对象:

  1. 对象A
  2. 对象B
  3. 对象C

ObjectA 包含 ObjectB 为 FetchType=EAGER ObjectB 包含 ObjectC 作为 FetchType=LAZY

我们正在获取 ObjectA。因此,由于渴望获取类型,它会自动获取 ObjectB。 但是当我尝试使用 ObjectB 获取 ObjectC 时,会出现此错误。

代码太大且专有。所以,不能分享代码。

注意: 1. 所有这些操作都在一个事务中完成。 2.我检查了日志,发现会话没有被关闭。 3. 我找到了类似的链接 - LazyInitializationException in JPA and Hibernate 我也在我的代码中使用 annotationDriven 标记,正如这个链接中所建议的那样。

我不知道为什么会这样。

【问题讨论】:

  • 你能和我们分享一下代码/配置/日志吗?谢谢
  • 我想你已经把@Transactional 放在你的服务类上?
  • @geert3: 代码太大而且专有。所以,不能分享代码。
  • @StijnGeukens:是的,我已经说过了。
  • “即使会话没有关闭也会出现延迟初始化异常” - 那么你如何证明呢?因为目前我只能假设加载实体的会话已关闭,而您只是不明白为什么。当您说“a”会话已打开时,我当然会完全相信您-但我不相信您是加载实体的会话。例如,当您有嵌套事务情况时,问题可能已经发生。

标签: java hibernate debugging lazy-loading


【解决方案1】:

我的理解正确吗?

ObjectA 包含 ObjectB,因为 FetchType=EAGER ObjectB 包含 ObjectC 如 FetchType=LAZY

我们正在获取 ObjectA。因此,由于渴望获取类型,它是 自动获取 ObjectB。但是当我试图获取 ObjectC 使用 ObjectB,它给出了这个错误。

ObjectA.getObjectB = 好的?我的意思是没有抛出异常或没有错误对吗?

那么当你通过 ObjectB 访问 ObjectC 时:

  1. ObjectB.getObjectC 或
  2. ObjectA.getObjectB.getObjectC ?

你得到一个 LazyInitializationException 异常。

Hibernate 文档说..

Hibernate 将抛出 LazyInitializationException,如果 在范围之外访问未初始化的集合或代理 会话,即当实体拥有集合或拥有 对代理的引用处于分离状态。

有时需要在关闭之前初始化代理或集合 会议。您可以通过调用 cat.getSex() 或 例如 cat.getKittens().size()。但是,这可能会令人困惑 对于代码的读者来说,泛型代码不方便。

静态方法 Hibernate.initialize() 和 Hibernate.isInitialized(),为应用程序提供了一个方便的 使用延迟初始化的集合或代理的方式。 Hibernate.initialize(cat) 将强制初始化代理, cat,只要它的 Session 仍然打开。休眠.初始化( cat.getKittens() ) 对小猫的收集有类似的效果。

来自 - https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-initialization

你有两个选择

在 ObjectB 和 ObjectC 之间的关系上将 FetchType=LAZY 更改为 FetchType=EAGER

或使用Hibernate.initialize(ObjectC); 在事务结束之前初始化 objectC..

希望这会对你有所帮助..

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 2011-07-18
    • 2012-07-27
    • 2017-10-08
    • 2014-03-21
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多