1

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

4

2 に答える 2

1

@Transactional アノテーションはサービス層に存在します。@Transactional でマークされたサービス メソッドは、その中から DAO 呼び出しがいくつ行われても、ACID プロパティに従います。

これは、DAO メソッドに @Transactional のアノテーションを付ける必要がないことを意味します。

私は似たようなことに取り組んでおり、これが私が行った方法であり、データは一貫しています。

これを試して、まだ一貫性のないデータが得られるかどうかを確認してください。

于 2012-09-11T19:47:25.057 に答える
0

@PersistenceContext注釈 (DAO の EntityManager の上) を Bean と組み合わせて使用​​しますか (およびXML タグを使用している場合は BeanPersistenceAnnotationBeanPostProcessorを定義する必要はありません) ? そうでない場合は、これが問題の原因だと思います。PersistenceAnnotationBeanPostProcessor<context:annotation-config/><context:component-scan/>

于 2014-08-20T13:16:48.603 に答える