Hibernate LazyInitializationException:未能延迟初始化角色集合
Posted
技术标签:
【中文标题】Hibernate LazyInitializationException:未能延迟初始化角色集合【英文标题】:Hibernate LazyInitializationException: failed to lazily initialize a collection of role 【发布时间】:2011-04-27 03:40:26 【问题描述】:我有一个 Web 服务,它本质上是一个 DAO 的包装器。我正在调用 Web 服务/DAO 来请求实体集合。
“父”实体类包含“子”实体对象的集合,即一对多关系。获取“父”实体集合(即 myDAO.findAll())的 DAO 方法调用没有问题返回,但是 Web 服务调用的最终结果是此异常:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Station.observations, no session or session was closed
一些背景资料:
我有两个实体,Station 和 Observations。 Station 实体(“父级”)包含 Observations 对象(“子级”)的集合。
Station 实体的 DAO 类,StationDao 的调用方法 findAll() 的代码如下:
private SessionFactory sessionFactory;
private Class<T> persistentClass;
public List<T> findAll()
return getCurrentSession().createQuery("from " + persistentClass.getName()).list();
在这种情况下,我对在返回父项集合之前完全获取与父项(站)相关的子项(观察)集合不感兴趣。然而,似乎在返回响应中的父(站)对象集合之前尝试完全获取这些子(观察)对象,但由于原始会话不再可用,因此失败了。
谁能建议我如何解决这个错误?也许有一种方法可以在请求的整个生命周期内保持会话?
提前感谢您的帮助!
--詹姆斯
【问题讨论】:
搜索“open session in view”模式 您可以尝试快速获取 Observations,但如果您想保持延迟加载,则必须确保会话处于活动状态。我建议您搜索“工作单元”和事务。 感谢 cmets。我正在使用此处建议的方法:community.jboss.org/wiki/OpenSessioninView,但不幸的是,当我进入过滤器代码以获取当前会话时,我收到一条错误消息,告诉我“没有绑定到线程的休眠会话”。我的 DAO 类使用 @Transactional 进行注释,并且我已将 Spring 应用程序上下文中的 设置为 Hibernate 事务管理器。任何人都可以建议我应该将什么视为我的错误的可能原因? 【参考方案1】:我遇到过“无法延迟初始化角色集合”是由于调用后使用持久对象引起的情况
HibernateTemplate.clear()
即使会话仍然处于活动状态,旧对象也不是。解决问题的一种可能方法是再次从会话中获取对象。
【讨论】:
以上是关于Hibernate LazyInitializationException:未能延迟初始化角色集合的主要内容,如果未能解决你的问题,请参考以下文章
Spring和Hibernate的注解整合 hibernate3和hibernate4/5的区别