0

私は自分の実体の束に1対多の関係を持っています。ただし、子に値を定義する必要はありません。1対多になる可能性があるため、nullになる可能性があります。

子オブジェクトを作成しないと、テストは参照整合性制約違反で失敗します。

結合にnullabletrueを追加しようとしましたが、問題は解決しなかったようです。

@JoinColumn(name = "image_relation")
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany
private List<Image> productImageGroup;

熱心なフェッチタイプを使用してみましたが、別のエラーが発生しました。

@JoinColumn(name = "product_item_relation")
@OneToMany(fetch=FetchType.EAGER)
private List<ProductItems> productItemGroup;

スロー:

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
4

1 に答える 1

1

この問題は、@LazyCollectionの誤用に関連している可能性があります。

複数のリストが熱心にフェッチされると、複数のバッグ例外がスローされます。これは2つの方法で解決できます。

リストをセットに置き換えます。任意の数のセットを熱心にフェッチすることができます。

@JoinColumn(name = "product_item_relation")
@OneToMany(fetch=FetchType.EAGER)
private Set<ProductItems> productItemGroup;

または、熱心なフェッチを削除して、プログラムコードでこれを処理します

@JoinColumn(name = "product_item_relation")
@OneToMany
private List<ProductItems> productItemGroup;

public List<MyObject> getMyObjects(){
    List<MyObject> objects = entityManager.createQuery("SELECT o FROM MyObject o").getResultList();
    // OneToMany not fetched yet
    for(MyObject o : objects)
        Hibernate.initialize(o.getProductItemGroup()); // Same as simply accessing the list to force loading, but states your intention more clearly.
    // OneToMany collection is now fetched.
    return objects;
}

@org.hibernate.annotations.Fetch(fetchMode)コレクションで指定し、副選択または結合を指定することで、このパフォーマンスを大幅に向上させることができます。これはHibernate固有のアノテーションであり、アプリケーションはベンダーに依存しなくなることに注意してください

于 2013-03-27T16:44:00.897 に答える