2010-10-18 91 views
0

我有一个Web服务,它本质上是一个DAO的包装。我正在调用Web服务/ DAO来请求一组实体。Hibernate LazyInitializationException:未能懒惰地初始化一个角色集合

“父”实体类包含“子”实体对象的集合,即一对多关系。它取“父”实体收集的DAO方法调用(即myDAO.findAll())没有问题返回,但是Web服务调用的最终结果是这样的例外:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Station.observations, no session or session was closed 

一些背景资料:

我有两个实体,站和观测。站实体(“父”)包含Observations对象(“子”)的集合。

的站实体的DAO类,StationDao已为方法如下代码被调用,的findAll():

private SessionFactory sessionFactory; 

private Class<T> persistentClass; 

public List<T> findAll() 
{ 
    return getCurrentSession().createQuery("from " + persistentClass.getName()).list(); 
} 

在这种情况下,我不感兴趣的孩子(的意见)的集合相关在收回父母之前将父母(站)全部取出。但是,在返回响应中的父(站)对象集合之前,似乎尝试完全获取这些子(观察)对象,并且由于原始会话不再可用而失败。

任何人都可以建议我如何解决这个错误?也许有一种方法可以在请求的整个过程中坚持会话吗?

在此先感谢您的帮助!

- 詹姆斯

+0

搜索“open session in view”模式 – KeatsPeeks 2010-10-18 20:44:13

+0

您可以尝试获取Observations渴望,但如果要保留延迟加载,则必须确保会话处于活动状态。我建议你搜索“工作单元”和交易。 – zoidbeck 2010-10-18 20:44:55

+0

感谢您的评论。我使用的是这里建议的方法:http://community.jboss.org/wiki/OpenSessioninView,但不幸的是,当我进入过滤器代码来获取当前会话时,出现错误,告诉我“没有Hibernate Session绑定到线程” 。我的DAO类用@Transactional注释,我在Spring应用程序上下文中将设置为Hibernate事务管理器。任何人都可以建议我应该看看作为我错误的可能原因吗? – 2010-10-18 23:04:47

回答

0

我有情况时“无法初始化懒洋洋角色的集合”是通过使用持久对象调用

HibernateTemplate.clear() 

即使会议是仍然活跃后引起的,旧对象不是。解决该问题的一种可能方法是再次从会话中获取对象。

相关问题