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
から削除すると問題は解決しますが、必要なので、実際の解決策は、代わりにを使用することです(Parent
AnotherParent
@LazyCollection(LazyCollectionOption.FALSE)
FetchType
ボジョ解決策についてはこちらをご覧ください。
ベストアンサー1
新しいバージョンの Hibernate (JPA 2.0 をサポート) なら、この問題を処理できると思います。ただし、それ以外の場合は、コレクション フィールドに次の注釈を付けることで回避できます。
@LazyCollection(LazyCollectionOption.FALSE)
fetchType
注釈から属性を削除することを忘れないでください@*ToMany
。
しかし、ほとんどの場合、 はSet<Child>
よりも適切であることに注意してくださいList<Child>
。したがって、本当に が必要な場合を除き、List
を選択してください。Set
注意して使用してください
を使用すると、次のように記述される基礎となる直積が除去さSet
れないことに注意してください。ヴラド・ミハルチェアの回答、「最悪の解決策」として特集されました!