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 サイトの他の関連記事を参照してください。