簡體   English   中英

JPA Hibernate集合未延遲加載

[英]JPA Hibernate collections not lazily loaded

我以這樣一種方式進行了JPA設置:如果我不使用延遲加載,則幾乎將加載整個數據庫。 我也直接在模型上使用序列化,因此有時我需要初始化代理。

我只想在集合上使用延遲加載。 急切地獲取一些奇異實體的事實就很好了。 但是,無論我如何嘗試設置集合,我都永遠不會得到代理集合,而我總是會得到完全加載的集合。

這是一些示例代碼:

@Entity
public class Thread implements Externalizable {
    @OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY)
    public List<Reply> getReplies() {
        return replies;
    }

所以這里的問題是,當我檢查調試器時,答復的persistantBag-list總是充滿信息,是實際的答復對象,而不是我想要的空代理。

當我想要線程時,無論是否具有fetch = FetchType.LAZY,我都始終使用完全加載的entityManager.find(Thread.class,“ ID”)。

據我了解,設置fetchtype lazy應該可以按我的意願工作。 另外,我希望在使用thread.getReplies()時加載實體,以便可以序列化並將其發送到客戶端。 我不知道getReplies是否可以與代理實體一起工作,因為我從來沒有延遲加載任何集合。

一方面,我不使用Intellij並將其用於通過Hibernate設置JPA。 我也曾問過一個類似的問題,我希望集合完全為空,但是我不確定這是否可行,因此我要問這個問題。

JPA Hibernate希望延遲加載以返回空集合

對於這個關於stackoverflow的基本問題,我還沒有看到一個好的答案。 如果由於我是JPA / Hibernate和數據庫的新手,那么如果確實以教學法回答了該問題,請僅通過鏈接回復。

提前非常感謝您!

惰性集合不包含代理。 該集合本身是一個延遲加載的集合。 這意味着當您從數據庫中獲取線程時,其回復列表將不會初始化。

調用getReplies()只會返回此未初始化的列表。 僅當在列表本身上調用方法(如size()iterator() )時,Hibernate才會通過執行SQL查詢加載線程的所有答復狀態來初始化列表。

使用調試器檢查集合中包含的內容不是一個好主意,因為調試器通常在背后的列表上調用方法,這會導致列表初始化。 您可以使用Hibernate.isInitialized(thread.getReplies())方法檢查集合是否已初始化。

關於另一個問題:Hibernate用於將數據庫行映射到對象。 如果某個線程有回復,則Hibernate不會通過向您返回一個空列表來告訴您它沒有任何線程。 那將是一個嚴重的錯誤。 如果您不想加載回復,只需不要在回復列表中調用任何方法。

暫無
暫無

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

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