首頁  >  文章  >  Java  >  ## 為什麼使用 FetchType.EAGER 的 Hibernate Criteria 會導致重複的訂單物件?

## 為什麼使用 FetchType.EAGER 的 Hibernate Criteria 會導致重複的訂單物件?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-26 03:50:28490瀏覽

## Why Does Hibernate Criteria with FetchType.EAGER Result in Duplicate Order Objects?

Hibernate Criteria 使用FetchType.EAGER 返回多個重複訂單

問題:

使用時具有FetchType.EAGER 的Hibernate Criteria 用於一對多關係,結果清單包含同一Order 物件的多個副本。

原始程式碼:

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>

使用FetchType.EAGER 修改碼:

<code class="java">public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}</code>

問題:

為什麼使用FetchType.EAGER 修改程式碼會導致多個Order 物件的副本?

答案:

啟用急切獲取時會出現此行為。在 Order 和 OrderTransaction 表之間執行聯接,產生與常規 SQL 聯結相同的行數。因此,每個 Order 物件出現多次,對應於相關 OrderTransaction 記錄的數量。

說明:

使用 FetchType.EAGER 取得資料時使用了外連接。這意味著即使一個Order沒有相關的OrderTransaction記錄,它仍然會包含在結果集中。結果是 Order 物件的列表,每個物件都可能與多個 OrderTransaction 物件關聯。

解決方案:

要避免 Order 物件的多個副本,請考慮使用集合而不是列表以防止重複。或者,在 Criteria 查詢中使用 DistinctRootEntity,它明確指定要傳回的不同 Order 物件。

範例:

<code class="java">Criteria criteria = getHibernateSession()
        .createCriteria(Order.class)
        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
        .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));</code>

以上是## 為什麼使用 FetchType.EAGER 的 Hibernate Criteria 會導致重複的訂單物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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