Spring @Transactional で JPA2/Hibernate を使用する JSF2 アプリケーションがあります。UI (バッキング Bean) には @Transactional ステートメントはなく、サービス層にのみあります。(DAO で @Transactional(propagation=Propagation.MANDATORY) を使用して、すべての呼び出しがトランザクションで発生するようにしています。) それはすべて非常にうまく機能しますが、...
トランザクション サービス メソッドを使用してエンティティを開いて更新すると、取得したエンティティが古い場合があります。同じセッションの同じユーザーであることは問題ではありません。場合によっては、JPA の「読み取り」メソッドが、既に置き換えられている (あるはずの) 古い古いエンティティを返すことがあります。これはかなり長い間私を困惑させましたが、Entity Manager のキャッシュが原因であることが判明しました。DAO には @Repository のアノテーションが付けられているため、注入された EntityManager が再利用されています。トランザクションが完了すると、エンティティ マネージャーは自動的にクリアされると予想していました。しかし、そうではありません。通常、Entity Manager は正しい値を返しますが、多くの場合、代わりに以前のトランザクションから古い値を返します。
回避策として、DAO 読み取りメソッドに戦略的な entityManager.clear() ステートメントを散りばめましたが、それは醜いです。entityManagers は、各トランザクションの後にクリアする必要があります。
誰もこれを経験しましたか?適切な解決策はありますか?各トランザクションの後にエンティティ マネージャーをクリアできますか?
どうもありがとう。
私が使用している: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean および org.springframework.orm.jpa.JpaTransactionManager