web-dev-qa-db-ja.com

@LazyCollection(LazyCollectionOption.FALSE)と@OneToMany(fetch = FetchType.EAGER)の違い

「遅延読み込み」については1つ疑問があります。 @LazyCollection(LazyCollectionOption.FALSE)@OneToMany(fetch = FetchType.EAGER)の使用の違いは何ですか?

私のアプリケーションでは2つのリストを使用していますが、この形式で使用する場合:

@OneToMany(mappedBy = "consultaSQL", orphanRemoval = true, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
private List<ParametroSQL> parametros;


@OneToMany(mappedBy = "consulta", orphanRemoval = true, fetch = FetchType.EAGER,
        cascade = CascadeType.ALL)
private List<Contato> contatos;

私はこのエラーがあります:

原因:org.hibernate.loader.MultipleBagFetchException:複数のバッグを同時にフェッチできません

これは、Hibernateが2つのリストを同時にロードできないために発生することを知っています。しかし、この形式を使用する場合:

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "consultaSQL", orphanRemoval = true,
        cascade = CascadeType.ALL)
private List<ParametroSQL> parametros;

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "consulta", orphanRemoval = true,
        cascade = CascadeType.ALL)
private List<Contato> contatos;

それは完全に動作します。

英語のおかげでごめんなさい

17
Gilvan André

アノテーション間の基本的な違いは、@OneToManyとそのパラメータ(例:fetch = FetchType.EAGER)は純粋なJPAです。 HibernateやEclipseLinkなどの任意のJPAプロバイダーで使用できます。

@LazyCollection一方、Hibernate固有であり、Hibernateを使用する場合にのみ機能します。

可能であれば、できるだけJPA仕様に準拠するようにしてください。これにより、プロバイダーを簡単に切り替えることができます(少なくとも理論的には)。

あなたの本当の問題については、 this 回答が示唆するように、JPA 2.0をサポートしないHibernateバージョンを使用している可能性がありますか?

13
Magnilex

私はこれと同じ問題を抱えていると思います...

すべてのコレクションを試してください...

 @Fetch(FetchMode.SUBSELECT)

エラーを排除する必要があります

0
Gora

この投稿で提案されているように、 https://stackoverflow.com/a/5865605/5619076 セットごとにリストを変更すると、MultipleBagFetchExceptionが解決されます。それは私のものを解決しました。

0
OlivierTerrien