ホームページ >Java >&#&チュートリアル >SessionFactory の初期化中に Hibernate の MultipleBagFetchException を解決するにはどうすればよいですか?

SessionFactory の初期化中に Hibernate の MultipleBagFetchException を解決するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-22 18:10:09845ブラウズ

How to Resolve Hibernate's MultipleBagFetchException During SessionFactory Initialization?

Hibernate での MultipleBagFetchException: 複数のバッグの同時フェッチ

複数のバッグを同時にフェッチしようとすると、Hibernate で org.hibernate.loader.MultipleBagFetchException が発生します。 SessionFactory の初期化中。この例外は、次のシナリオで発生します。

親エンティティが、OneToMany 関連付けを使用して複数の子エンティティとの関係を維持します。 Parent クラスでは、children プロパティは Child オブジェクトのコレクションを表します。

children プロパティで FetchType.EAGER を使用すると、Hibernate は SessionFactory の作成中に、Parent に関連付けられたすべての Child エンティティを一括ロードしようとします。ただし、Hibernate はデータベースから複数のバッグ (つまり、子コレクション) を同時にフェッチできないため、これにより MultipleBagFetchException 例外が発生します。

この問題を解決するには、@ から FetchType.EAGER 属性を削除することをお勧めします。 OneToMany アノテーション。あるいは、コレクション フィールドに @LazyCollection(LazyCollectionOption.FALSE) の注釈を付けて、同じ Eager フェッチ戦略を実現することもできます。

追加の考慮事項

親がエンティティには、AnotherChild オブジェクトのコレクションを含む AnotherParent など、FetchType.EAGER コレクションを持つ別のエンティティが含まれます。 Hibernate では MultipleBagFetchException も発生します。これは、Hibernate が複数のコレクションの同時 Eager フェッチを処理できないために発生します。

この問題に対処するには、Parent コレクションと AnotherParent コレクションの両方で FetchType.EAGER 属性を @LazyCollection(LazyCollectionOption.FALSE) に変更します。コレクションに List の代わりに Set を使用すると、この例外が発生する可能性が減ることに注意してください。

注意:

Set を使用しても、根本的なデカルト積の問題は解消されません。 Vlad Mihalcea が別の回答で説明しています。このため、パフォーマンスへの影響と潜在的な副作用を慎重に考慮して、Eager フェッチを慎重に使用することが重要です。

以上がSessionFactory の初期化中に Hibernate の MultipleBagFetchException を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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