1. ホーム
  2. java

[解決済み] HibernateがMultipleBagFetchExceptionをスローする - 複数のバッグを同時にフェッチできない

2022-03-18 09:22:02

質問

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

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

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

Parent.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;

}

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


EDIT

OK、私の問題は、別のquot;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;

}

AnotherParent.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 (おかげさまで ボジション を解決してくれました)。

解決方法は?

新しいバージョンのハイバーネート(JPA 2.0をサポート)では、これを処理する必要があると思います。しかし、そうでない場合は、コレクションフィールドにアノテーションを付けて回避することができます。

@LazyCollection(LazyCollectionOption.FALSE)

を削除することを忘れないでください。 fetchType 属性は @*ToMany アノテーションを使用します。

しかし、ほとんどの場合 Set<Child> よりも、より適切です。 List<Child> が本当に必要でない限りは List - を狙う。 Set

しかし、セットを使用すると、次のことを忘れないでください。 はありません。 下敷きになるものを排除する 直交積 で説明したように Vlad Mihalcea氏による回答 !