Web アプリケーションでは、JPA エンティティを使用して、ドメイン オブジェクトを基礎となるデータベースとの間で永続化 (および取得) しています。
これらの JPA エンティティは、Web アプリケーションの実行時間全体にわたって、メモリ内キャッシュ構造 ( と考えてください) で「ホット」に保たれMap<UniqueID, Entity>
ます。
Web アプリケーションにリクエストを送信すると、リポジトリからエンティティが読み込まれます。このエンティティは、メモリ内キャッシュ構造に配置されます。このリクエストの存続期間中、このエンティティの任意のフィールドに問題なくアクセスできます。この最初のリクエストでは、他のエンティティへのリレーションシップの遅延読み込みも正常View
に機能しますOpenEntityManagerInViewInterceptor
。
最初のリクエストは終了しました。
Web アプリケーションに対して次の要求を行っています。このリクエストは、別のエンティティを要求します。このエンティティは既にメモリ内キャッシュ構造にあるため、そこから読み込まれます。このエンティティから、他のエンティティへのリレーションシップを遅延ロードする必要があるフィールドにアクセスしようとします。残念ながら、これは不快な原因になります org.hibernate.LazyInitializationException: could not initialize proxy - no Session
(私は基礎となるJPA実装としてHibernateを使用しています)
私の理解では、この例外は、最初のリクエストが終了した後、JPA/Hibernate が JPA セッションを終了したにもかかわらず、メモリ内キャッシュ構造内のエンティティがこれらのセッションのいずれかが存在することを期待しているという事実に起因しています。次のリクエストによって遅延読み込みエンティティのメカニズムが起動された時点で、遅延読み込みメカニズムは存在しないセッションを見つけることができません。
私の問題の解決策は何ですか?