2010-10-18 115 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() 

即使會議是仍然活躍後引起的,舊對象不是。解決該問題的一種可能方法是再次從會話中獲取對象。

相關問題