2009-06-02 19 views
1

NamedQueryを使用してエンティティを取得するメソッドがあります。私は各エンティティの値を更新し、別の名前付きクエリ(同じメソッドでTransaction)を実行して古い値でフィルタリングし、変更しなかった場合と同じエンティティを返します。JPA NamedQueryが変更されたエンティティへの変更を取得しない

私は、EntityManagerをフラッシュする必要があること、また自動的に実行する必要があることを理解していますが、違いはありません。

私はhibernate SQLロギングを有効にしていますが、flushを呼び出すとコンテナトランザクションがコミットするときに、エンティティがでないことがわかります。

EntityManager entityManager = getPrimaryEntityManager(); 
MyEntity myEntity = entityManager.find(MyEntityImpl.class, allocationId); 
myEntity.setStateId(State.ACTIVE); 
// Flush the entity manager to pick up any changes to entity states before we run this query. 
entityManager.flush(); 
Query countQuery = entityManager 
     .createNamedQuery("MyEntity.getCountByState"); 
// we're telling the persistence provider that we want the query to do automatic flushing before this 
// particular query is executed. 
countQuery.setParameter("stateId", State.CHECKING); 
Long count = (Long) countQuery.getSingleResult(); 
// Count should be zero but isn't. It doesn't see my change above 

答えて

1

正直に言うと私はJPAとその慣れていないんだけど、私はHiberateのセッションマネージャと同様の問題に遭遇しました。私が修正したのは、指定されたオブジェクトをHibernateのセッションから手動で削除してから再度クエリを実行してデータベースからルックアップを実行し、オブジェクトをキャッシュから取得しないようにすることでした。 JPAのEntityManagerで同じことを試みるかもしれません。

0

私はちょうど同じ問題を持っていたし、二つのものを発見:まず

  • を、あなたは永続コンテキスト および/またはクエリのFlushModeをチェックする必要があります。
  • 第2に、トランザクション管理とクエリ の実行の両方について、エンティティマネージャが全く同じオブジェクト であることを確認してください。私の場合は、entity managerにMockitoのスパイがありましたが、 はトランザクション管理を破るのに十分でした。
関連する問題