簡體   English   中英

休眠中的延遲加載

[英]Lazy loading in Hibernate

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

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

我嘗試將一個新會話與該集合相關聯,然后進行解析,但這給出了相同的結果。

有人知道一旦原始會話結束后我如何解決懶惰的集合?

謝謝...

--Steve

在訪問未初始化的集合或其他代理之前,您需要使用merge()lock()將先前加載的對象附加到新的Session上。 我不知道您是如何做到的,但事實是,當您嘗試檢索其用戶groups時,您的User仍然處於分離狀態。

三種選擇:

  1. 每當您要與當前會話斷開連接時,請在您的集合上調用Hibernate.initialize(..)

  2. 將集合聲明為FetchType.EAGER

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

您有幾個選擇,但是主要的問題是您需要擴展會話,或者將對象重新附加到會話。

Pascal提供了有關如何將對象重新連接到新會話的答案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM