2010-02-01 136 views
2

我的Java Web應用程序使用Hibernate執行ORM。在我的一些對象中,我使用延遲加載來避免獲取數據,直到我絕對需要它。問題是我在會話中加載初始對象,然後該會話被銷燬。當我稍後嘗試解析對象中的延遲加載集合時,出現以下錯誤:在休眠中延遲加載

org.hibernate.LazyInitializationException:無法懶惰地初始化角色集合:common.model.impl.User.groups,沒有會話或會話被關閉

我試着將一個新的會話與集合相關聯然後解析,但是這給出了相同的結果。

有沒有人知道我可以解決懶惰的集合,一旦原來的會議不見了?

謝謝...

--Steve

+1

您是否在stackoverflow中搜索?搜索給出了很多線索 – Salandur 2010-02-01 20:46:51

+0

其實,我在StackOverflow和其他地方搜索過。我發現似乎沒有給出適用於我的問題的答案。如果您有一些我可能錯過的特定帖子,請發帖,以便我看看它是否有幫助。 – Steve 2010-02-02 12:34:42

回答

2

三個選項:

  1. 在您的收藏電話Hibernate.initialize(..)時,它即將從當前會話

  2. 斷開連接聲明集合作爲FetchType.EAGER

  3. merge(..)用戶對象回到新會話

2

訪問未初始化的集合或代理之前,您需要到以前裝載的對象附加到一個新的Sessionmerge()lock()。我不知道你是如何做到這一點的,但事實是,當你試圖檢索他的groups時,你的User仍然分離。

1

您有幾個選項,但主要問題是您需要擴展會話或將對象重新連接到會話。

Pascal提供瞭如何將對象重新附加到新會話的答案。

另一種選擇是改變你處理會話的方式。在我們的應用程序中,我們也使用Spring,並讓Spring爲我們管理Hibernate的會話。這提供了很好的解決方案,但您仍然需要不時重新添加對象,這只是您在Web環境中使用Hibernate的一部分。