LazyInitializationException中时未关闭会话(lazyinitializat

2019-11-03 11:28发布

我在我的对象使用Hibernate,甚至得到LazyInitializationException异常时未关闭会话。

下面是在发行对象的关系。 有3个对象:

  1. 对象
  2. 对象B
  3. ObjectC

对象A包括作为对象B = FetchType EAGER对象B包括作为ObjectC = FetchType LAZY

我们取对象A。 因此,由于渴望获取类型的,它会自动获取对象B。 但是,当我试图使用对象B ObjectC去取,它给这个错误。

该代码太大而专有的。 因此,不能共享代码。

注:1,所有这些操作都被只有一个事务中完成的。 2.我查了日志,并发现会话没有被关闭。 3.我发现类似的联系- LazyInitializationException中在JPA和Hibernate我使用annotationDriven标签也是在我的代码,在这个环节上提出。

如果它为什么发生,我没有得到。

Answer 1:

我的理解是正确的?

对象A包括作为对象B = FetchType EAGER对象B包括作为ObjectC = FetchType LAZY

我们取对象A。 因此,由于渴望获取类型的,它会自动获取对象B。 但是,当我试图使用对象B ObjectC去取,它给这个错误。

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

那么当你访问ObjectC由对象B通过:

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

你会得到LazyInitializationException中的一个例外。

Hibernate文档说..

LazyInitializationException中将由休眠如果未初始化的集合或代理会话,即,范围,之外访问被抛出时拥有的集合,或者具有参考到代理的实体处于分离状态。

有时,一个代理或者集合需要在Session关闭前被初始化。 你可以通过调用cat.getSex()或cat.getKittens强制初始化()。大小(),例如。 然而,这可能会造成混淆的代码的读者,这是不符合通常的代码。

静态方法同样,Hibernate.initialize()和Hibernate.isInitialized(),提供延迟加载集合或代理的一种便捷方式申请。 同样,Hibernate.initialize(CAT)将强制代理,猫的初始化,只要它的Session处于打开状态。 同样,Hibernate.initialize(cat.getKittens())对小猫的集合类似的效果。

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

你有两个选择

更改FetchType=LAZYFetchType=EAGER的对象B和ObjectC之间的关系

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

希望这个能对您有所帮助..



文章来源: lazyinitializationexception when session is not closed