我在我的对象中使用Hibernate,即使会话没有关闭,也会得到lazyinitializationexception。
这是有争议的对象的关系。有3个对象:
ObjectA将ObjectB包含为FetchType = EAGER ObjectB包括ObjectC作为FetchType = LAZY
我们正在获取ObjectA。因此,由于渴望获取类型,它会自动获取ObjectB。 但是当我尝试使用ObjectB获取ObjectC时,它会发出此错误。
代码太大且专有。因此,无法共享代码。
注意: 1.所有这些操作仅在一次交易中完成。 我检查了日志,发现该会话没有被关闭。 3.我发现了类似的链接 - LazyInitializationException in JPA and Hibernate我也在我的代码中使用了注释驱动标记,如此链接所示。
我不知道为什么会这样。
答案 0 :(得分:0)
我的理解是否正确?
ObjectA包括ObjectB作为FetchType = EAGER ObjectB包括ObjectC 如FetchType = LAZY
我们正在获取ObjectA。因此,由于渴望获取类型,它是 自动获取ObjectB。但是当我试图获取ObjectC时 使用ObjectB,它给出了这个错误。
ObjectA.getObjectB =好吗?我的意思是没有异常抛出或没有错误吗?
然后当你通过ObjectB访问ObjectC时:
并且您获得了LazyInitializationException的异常。
Hibernate Documentation说明了......
如果是的话,Hibernate会抛出一个LazyInitializationException 未初始化的集合或代理是在范围之外访问的 会话,即拥有该集合或拥有该集合的实体 对代理的引用处于分离状态。
有时需要在关闭之前初始化代理或集合 会议。您可以通过调用cat.getSex()或强制初始化 例如,cat.getKittens()。size()。但是,这可能令人困惑 对于代码的读者而言,这对于通用代码来说并不方便。
静态方法Hibernate.initialize()和 Hibernate.isInitialized(),为应用程序提供了方便 使用延迟初始化的集合或代理的方式。 Hibernate.initialize(cat)将强制初始化代理, 猫,只要它的会话仍然开放。同样,Hibernate.initialize( cat.getKittens())对小猫集合有类似的效果。
您有两个选项
将您对ObjectB和ObjectC
之间关系的FetchType=LAZY
更改为FetchType=EAGER
或使用Hibernate.initialize(ObjectC);
在事务结束之前初始化objectC ..
希望这会对你有帮助..