首頁  >  文章  >  Java  >  為什麼 Hibernate Criteria 在使用 FetchType.EAGER 時傳回子層級的多個副本?

為什麼 Hibernate Criteria 在使用 FetchType.EAGER 時傳回子層級的多個副本?

DDD
DDD原創
2024-10-27 04:29:29412瀏覽

Why Does Hibernate Criteria Return Multiple Copies of Children When Using FetchType.EAGER?

Hibernate Criteria 傳回具有FetchType.EAGER 的多個子副本

在Hibernate 中映射一對多關係時,例如TransOrder 類具有OrderTransactions列表,通常使用FetchType.EAGER 設定在父實體初始化期間急切地取得子實體。然而,當將此設定與 Hibernate Criteria 一起使用時,會出現一個奇怪的現象。

查詢結果重複訂單

考慮以下場景:一個 Order 類別是用以下列表定義的OrderTransactions 和 Criteria 查詢用於根據訂單狀態過濾訂單。使用預設的 FetchType.LAZY 設置,結果清單按預期包含唯一的 Order 實例。但是,在為 OrderTransaction 映射設定 FetchType.EAGER 後,Order 實例開始在結果中多次出現。

FetchType.EAGER 的預期行為

儘管使用 FetchType.EAGER 重複訂單可能看起來出乎意料,它與底層 SQL 行為一致。執行外部連線(由於 FetchType.EAGER 導致發生)時,結果集包含父實體和子實體的所有潛在組合,從而在存在多個子實體時導致父實例重複。

解決方案

為了即使使用FetchType.EAGER 也能獲得不同的Order 結果,Hibernate 提供了一種解決方法:

<code class="java">Collection result = new LinkedHashSet(session.createCriteria(...).list());</code>

此程式碼片段使用LinkedHashSet 過濾掉重複的Order 引用,確保結果清單僅包含唯一的Order 實例。

或者,如果目標是完全阻止聯接提取並堅持延遲加載,只需將 FetchType 設定恢復為 FetchType.LAZY。

以上是為什麼 Hibernate Criteria 在使用 FetchType.EAGER 時傳回子層級的多個副本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn