首頁 > Java > java教程 > 主體

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

Mary-Kate Olsen
發布: 2024-10-26 03:50:28
原創
489 人瀏覽過

## 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!