【发布时间】: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 事务管理器。任何人都可以建议我应该将什么视为我的错误的可能原因?
标签: hibernate orm lazy-loading one-to-many many-to-one