我有一個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();
}
在這種情況下,我不感興趣的孩子(的意見)的集合相關在收回父母之前將父母(站)全部取出。但是,在返回響應中的父(站)對象集合之前,似乎嘗試完全獲取這些子(觀察)對象,並且由於原始會話不再可用而失敗。
任何人都可以建議我如何解決這個錯誤?也許有一種方法可以在請求的整個過程中堅持會話嗎?
在此先感謝您的幫助!
- 詹姆斯
搜索「open session in view」模式 – KeatsPeeks 2010-10-18 20:44:13
您可以嘗試獲取Observations渴望,但如果要保留延遲加載,則必須確保會話處於活動狀態。我建議你搜索「工作單元」和交易。 – zoidbeck 2010-10-18 20:44:55
感謝您的評論。我使用的是這裏建議的方法:http://community.jboss.org/wiki/OpenSessioninView,但不幸的是,當我進入過濾器代碼來獲取當前會話時,出現錯誤,告訴我「沒有Hibernate Session綁定到線程」 。我的DAO類用@Transactional註釋,我在Spring應用程序上下文中將設置爲Hibernate事務管理器。任何人都可以建議我應該看看作爲我錯誤的可能原因嗎? –
2010-10-18 23:04:47