EclipseLinkは、エンティティを作成したエンティティマネージャーが使用できなくなった後でも、エンティティに遅延関係を読み込むことができます。Hibernateでは、これは機能しないか、少なくともその投稿の時点では機能しませんでした。
他のプロバイダーはどうですか?特にOpenJPAとDataNucleus?
これの欠点は何ですか(より複雑な実装を除く)?
EclipseLinkは、エンティティを作成したエンティティマネージャーが使用できなくなった後でも、エンティティに遅延関係を読み込むことができます。Hibernateでは、これは機能しないか、少なくともその投稿の時点では機能しませんでした。
他のプロバイダーはどうですか?特にOpenJPAとDataNucleus?
これの欠点は何ですか(より複雑な実装を除く)?
Hibernate では、オブジェクトを遅延ロードするために同じ EntityManager を使用できる必要がありますが、Open Session in View パターンを使用して柔軟な遅延ロードを簡単に実現できます。要するに、必要な限り EntityManager を開いたままにします。アプリケーションが開いている限り、同じ EntityManager を開いたままにするクライアント側アプリケーションを開発しました。これにより、基本的に記事で説明されているのと同じ動作が得られます。ただし、Roman が説明する「すぐに使える」遅延読み込みよりも実装が難しいことは確かです。
そうは言っても、遅延読み込みには欠点があります。開発者はフェッチ戦略を認識し、各戦略がいつ、どこで最も適切であるかを区別できなければなりません。そうしないと、N+1 Select Problemのような重大なパフォーマンスの問題が発生する可能性があります。さらに、ビューのレンダリング中にデータベース例外が発生する可能性が常にあります。
OpenJPA と DataNucleus について: 私はどちらも使用したことがありませんが、この投稿OpenSessionInViewFilter
では、OpenJPA には遅延読み込み用の も必要であることを示しています。This SO answerとthis forum postは、DataNucleus がOpenPersistenceManagerInViewFilter
遅延読み込みに必要であることを示しています。
EntityManagerがない場合は、データストアやEMFなどの知識がありません。したがって、移植性が必要な場合は(オブジェクトにその情報を自分で具体化する以外に)遅延読み込みを行うことはできません...つまり、JPA仕様の範囲外です。
DataNucleus JPAは、トランザクション外のフィールドの遅延読み込みを完全に実行します。明らかに、TRANSACTIONまたはEXTENDED永続コンテキストで実行しているかどうかを指定する必要があります。前者の場合、オブジェクトはトランザクションのコミット時にDETACHEDになり(デタッチすると遅延ロードできなくなります)、後者の場合、オブジェクトは残ります。管理済み(その状況では遅延読み込みが可能です)。