我在我的对象使用Hibernate,甚至得到LazyInitializationException异常时未关闭会话。
下面是在发行对象的关系。 有3个对象:
- 对象
- 对象B
- ObjectC
对象A包括作为对象B = FetchType EAGER对象B包括作为ObjectC = FetchType LAZY
我们取对象A。 因此,由于渴望获取类型的,它会自动获取对象B。 但是,当我试图使用对象B ObjectC去取,它给这个错误。
该代码太大而专有的。 因此,不能共享代码。
注:1,所有这些操作都被只有一个事务中完成的。 2.我查了日志,并发现会话没有被关闭。 3.我发现类似的联系- LazyInitializationException中在JPA和Hibernate我使用annotationDriven标签也是在我的代码,在这个环节上提出。
如果它为什么发生,我没有得到。
我的理解是正确的?
对象A包括作为对象B = FetchType EAGER对象B包括作为ObjectC = FetchType LAZY
我们取对象A。 因此,由于渴望获取类型的,它会自动获取对象B。 但是,当我试图使用对象B ObjectC去取,它给这个错误。
ObjectA.getObjectB = OK? 我的意思是没有抛出异常或没有错误吧?
那么当你访问ObjectC由对象B通过:
- ObjectB.getObjectC或
- 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=LAZY
到FetchType=EAGER
的对象B和ObjectC之间的关系
或使用Hibernate.initialize(ObjectC);
在交易结束之前初始化objectC ..
希望这个能对您有所帮助..