繁体   English   中英

事务内的org.hibernate.LazyInitializationException

[英]org.hibernate.LazyInitializationException within Transaction

当前使用稍旧的Hibernate(3.3.2.GA)-并在Transaction边界内获取org.hibernate.LazyInitializationException。 我确认调用方法被标记为@Transactional ,加上异常时的堆栈跟踪也显示了它: org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)

尽管如此,尝试遍历@CollectionOfElements立即引发LazyInitializationException并显示“没有会话或会话已关闭”。

调试它时,我看到相关集合上的Hibernate代理实际上在Hibernate加载后就具有null会话。 有什么需要担心的吗? 我如何跟踪并解决它-换句话说,在调试时,跟踪会话正在发生的最佳方法是什么?

显然,我知道将集合更改为Eager Fetch可以解决此问题,但是我想弄清楚为什么懒惰加载不起作用,因为在大多数情况下不需要此(可能是)大型集合。

谢谢!

我有完全相同的问题。 在我的情况下,此问题是由以下事实引起的:包含延迟加载的集合的实例之前已被手动逐出(均在事务边界内)。

关于这个问题的年龄,为了后代:

我遇到了同样的问题,因为我将实体缓存在内存中。 在以后的事务中访问这些实体后立即引发异常-与第一次收集实体时不同。 因此,丢失会话的问题。

通过设置适当的二级缓存来解决。

我的猜测是,当您从获取实体的方法中返回并开始对其进行迭代时,您已经处在不同的事务上下文中,从而导致了惰性初始化问题。 如果您使用的是DAO,请尝试将这两种方法都设置为同一事务(即,将它们设置为REQUIRED)。

我可能完全误会了。 我刚刚使用EJB3 + JPA对此进行了测试,并得到了您在获取实体的方法在不同的事务上下文中时描述的惰性初始化问题。

编辑:就像巴巴在他的评论中说的那样,一个更好的解决方案要么是急于通过HQL / Criteria(HQL中的fetch join子句)来获取,要么最好是在返回之前使用Hibernate.initialize。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM