Hibernate: SessionFactory 作成中の MultipleBagFetchException の修正
Hibernate を使用すると、SessionFactory の作成中に例外が発生する可能性があります:
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
これは通常、複数のコレクションをフェッチするときに発生します。エンティティ内で (FetchType.EAGER を使用して) エンティティを熱心に操作します。これにより、パフォーマンスの問題、データの不整合、メモリ オーバーヘッドが発生する可能性があります。
テスト ケース:
次の例を考えてみましょう:
@Entity public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER) private List<Child> children; } @Entity public class Child { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne private Parent parent; }
Inこの場合、Parent.children をフェッチすると、複数の子コレクションを同時にフェッチしようとするため、例外。
考えられる解決策:
1. FetchType.EAGER を削除:
Parent.children マッピングから FetchType.EAGER を削除します。これにより、Hibernate は必要に応じて子を遅延フェッチし、例外を解決します。ただし、パフォーマンスに影響する可能性があります。
2. LazyCollection を使用します:
FetchType.EAGER を使用する代わりに、子フィールドに @LazyCollection(LazyCollectionOption.FALSE) の注釈を付けます。これにより、Hibernate に対してコレクションを積極的にロードするように指示されますが、遅延初期化プロセスを介して例外が回避されます。
3. Set を使用します:
ほとんどの場合、Set
注意:
セットを使用しても、根本的なデカルト積の問題は解消されません。ヴラド・ミハルセアによって議論された。ただし、一般的にはこれより良いアプローチであり、パフォーマンスを向上させることができます。
以上がHibernate MultipleBagFetchException: SessionFactory 作成中の Eager Fetching の問題を解決するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。