データ アクセスに JPA を使用する Java EE アプリケーションを作成しています。最初は EclipseLink を使用していましたが、Moxy 経由で依存するバンドルされた Geronimo Javamail 実装が奇妙な問題を引き起こし、Sun Javamail を強制的に使用することができなかったため、JPA プロバイダーとして Hiberate に切り替えました。
EclipseLink は、レイジー/イーガー アノテーションを無視し、熱心にすべてをロードしていました。Hibernate はこれらの注釈に注意を払うため、依存オブジェクトはロードされません。つまり、人の親の遅延読み込みを使用して人をロードすると、遅延読み込みではないビューで親にアクセスすると、データベースセッションが閉じているという例外が発生します。
これを回避するには 2 つの方法があることを理解しています。ビューが必要とするすべてのデータをロードするメソッド (これにより、さまざまな量のデータを取得するために多数のメソッドが重複してサービス層が乱雑になります)
参考までに、私のレイヤーは View -> Controller -> Service -> Entity Object -> JPA です。小さなアプリであり、DTO アンチパターンが好きではないので、dto は持っていません。
Open Session in View パターンについて考えると、問題は OpenSessionInViewInterceptor と OpenSessionInViewFilter がどちらも Hibernate 固有であり、どちらも Spring 構成ファイルで休止セッションを宣言する必要があることです。私は、persistence.xml ファイルで構成された純粋な JPA を使用することを好みます。
ここでのオプションは何ですか? Spring 構成を変更して Hibernate を明示的にロードし、アプリケーション内で純粋な JPA を使用することはできますか? ビューからの遅延ロードという同じ結果を達成する純粋なJPAの方法はありますか?