[英]Lazy loading in Hibernate
我的Java Web應用程序使用Hibernate執行ORM。 在某些對象中,我使用延遲加載來避免獲取數據,直到我絕對需要它為止。 問題是我在會話中加載了初始對象,然后該會話被銷毀。 以后嘗試解析對象中的延遲加載的集合時,出現以下錯誤:
org.hibernate.LazyInitializationException:無法延遲初始化角色集合:common.model.impl.User.groups,沒有會話或會話被關閉
我嘗試將一個新會話與該集合相關聯,然后進行解析,但這給出了相同的結果。
有人知道一旦原始會話結束后我如何解決懶惰的集合?
謝謝...
--Steve
在訪問未初始化的集合或其他代理之前,您需要使用merge()
或lock()
將先前加載的對象附加到新的Session
上。 我不知道您是如何做到的,但事實是,當您嘗試檢索其用戶groups
時,您的User
仍然處於分離狀態。
三種選擇:
每當您要與當前會話斷開連接時,請在您的集合上調用Hibernate.initialize(..)
將集合聲明為FetchType.EAGER
merge(..)
您的用戶對象merge(..)
回到新會話
您有幾個選擇,但是主要的問題是您需要擴展會話,或者將對象重新附加到會話。
Pascal提供了有關如何將對象重新連接到新會話的答案。
另一個選擇是更改您處理會話的方式。 在我們的應用程序中,我們還使用Spring,並讓Spring為我們管理Hibernate的會話。 這提供了解決方案的很大一部分,但是您仍然需要不時地重新附加對象,這只是在Web環境中使用Hibernate的一部分方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.