会话未关闭时,lazyinitializationexception

时间:2014-11-27 12:09:48

标签: java hibernate debugging lazy-loading

我在我的对象中使用Hibernate,即使会话没有关闭,也会得到lazyinitializationexception。

这是有争议的对象的关系。有3个对象:

  1. 对象A
  2. 对象B
  3. ObjectC
  4. ObjectA将ObjectB包含为FetchType = EAGER ObjectB包括ObjectC作为FetchType = LAZY

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

    代码太大且专有。因此,无法共享代码。

    注意: 1.所有这些操作仅在一次交易中完成。 我检查了日志,发现该会话没有被关闭。 3.我发现了类似的链接 - LazyInitializationException in JPA and Hibernate我也在我的代码中使用了注释驱动标记,如此链接所示。

    我不知道为什么会这样。

1 个答案:

答案 0 :(得分:0)

我的理解是否正确?

  

ObjectA包括ObjectB作为FetchType = EAGER ObjectB包括ObjectC   如FetchType = LAZY

     

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

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

然后当你通过ObjectB访问ObjectC时:

  1. ObjectB.getObjectC或
  2. ObjectA.getObjectB.getObjectC?
  3. 并且您获得了LazyInitializationException的异常。

    Hibernate Documentation说明了......

      

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

         

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

         

    静态方法Hibernate.initialize()和   Hibernate.isInitialized(),为应用程序提供了方便   使用延迟初始化的集合或代理的方式。   Hibernate.initialize(cat)将强制初始化代理,   猫,只要它的会话仍然开放。同样,Hibernate.initialize(   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 ..

    希望这会对你有帮助..