ホームページ  >  記事  >  Java  >  FetchType.EAGER を使用すると、Hibernate 条件が子の複数のコピーを返すのはなぜですか?

FetchType.EAGER を使用すると、Hibernate 条件が子の複数のコピーを返すのはなぜですか?

DDD
DDDオリジナル
2024-10-27 04:29:29504ブラウズ

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

Hibernate 基準は FetchType.EAGER を持つ子の複数のコピーを返す

Hibernate で 1 対多の関係をマッピングする場合、 OrderTransaction のリストを持つ Order クラスでは、FetchType.EAGER 設定を使用して、親の初期化中に子エンティティを積極的にフェッチするのが一般的です。ただし、この設定を Hibernate Criteria で使用すると、奇妙な現象が発生します。

クエリ結果の繰り返し注文

次のシナリオを考えてみましょう。 Order クラスは、次のリストで定義されます。 OrderTransactions と Criteria クエリは、orderStatus に基づいて注文をフィルタリングするために使用されます。デフォルトの 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 に戻すだけです。

以上がFetchType.EAGER を使用すると、Hibernate 条件が子の複数のコピーを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。