Hibernate が MultipleBagFetchException をスローします - 複数のバッグを同時にフェッチすることはできません 質問する

Hibernate が MultipleBagFetchException をスローします - 複数のバッグを同時にフェッチすることはできません 質問する

Hibernate は SessionFactory の作成中にこの例外をスローします。

org.hibernate.loader.MultipleBagFetchException: 複数のバッグを同時にフェッチすることはできません

これは私のテストケースです:

親.java

@Entity
public Parent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 // @IndexColumn(name="INDEX_COL") if I had this the problem solve but I retrieve more children than I have, one child is null.
 private List<Child> children;

}

子.java

@Entity
public Child {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @ManyToOne
 private Parent parent;

}

この問題はどうですか? どうすればいいでしょうか?


編集

さて、私が抱えている問題は、別の「親」エンティティが親の中にあることです。私の実際の動作は次のとおりです。

親.java

@Entity
public Parent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @ManyToOne
 private AnotherParent anotherParent;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 private List<Child> children;

}

別の親.java

@Entity
public AnotherParent {

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private Long id;

 @OneToMany(mappedBy="parent", fetch=FetchType.EAGER)
 private List<AnotherChild> anotherChildren;

}

Hibernate は を含む 2 つのコレクションを好みませんFetchType.EAGERが、これはバグのようで、異常なことをしているわけではありません...

またはFetchType.EAGERから削除すると問題は解決しますが、必要なので、実際の解決策は、代わりにを使用することです(ParentAnotherParent@LazyCollection(LazyCollectionOption.FALSE)FetchTypeボジョ解決策についてはこちらをご覧ください。

ベストアンサー1

新しいバージョンの Hibernate (JPA 2.0 をサポート) なら、この問題を処理できると思います。ただし、それ以外の場合は、コレクション フィールドに次の注釈を付けることで回避できます。

@LazyCollection(LazyCollectionOption.FALSE)

fetchType注釈から属性を削除することを忘れないでください@*ToMany

しかし、ほとんどの場合、 はSet<Child>よりも適切であることに注意してくださいList<Child>。したがって、本当に が必要な場合を除き、Listを選択してください。Set

注意して使用してください

を使用すると、次のように記述される基礎となる直積が除去さSet れないことに注意してください。ヴラド・ミハルチェアの回答「最悪の解決策」として特集されました!

おすすめ記事