2016-10-25 4 views
0

guiceによって簡単なサービスが注入されています。これは、Hibernate、EntityManagerを使用します。手動で行を更新すると、Javaエンティティマネージャは変更をロードしません。

class BrillantPaulaServiceImpl implements BrillantPaulaService { 
    @Inject 
    EntityManager em; 

    @Override 
    public Status EnqueueStatusCheck(Integer statusId) { 
     Status status = em.find(Status.class, statusId); 
     EntityTransaction transaction = em.getTransaction(); 
     try { 
      //..... do some work 
     } finally { 
      if (transaction.isActive()) { 
       transaction.rollback(); 
      } 
     } 
    } 
    return status; 
} 

pgsqlから手動で行を更新すると、 "Status status = em.find(Status.class、statusId);"変更を表示しません。古いエンティティを返します。考えられる問題は何ですか?

+0

私はあなたが休止状態の第2レベルのキャッシュを持っているか、pgsqlステートメントがコミットされていないと思います。 –

答えて

3

em.find(...)は、まず永続コンテキストをチェックし、キャッシュされたエンティティがあるため、データベースから取得するのではなく、キャッシュされたエンティティを返すためです。 hereからの引用は次のとおりです。

指定されたプロパティを使用して、主キーで検索します。指定したクラスと主キーの エンティティを検索します。エンティティインスタンス が永続コンテキストに含まれている場合、そこから返されます。 ベンダー固有のプロパティまたはヒントが認識されない場合は、暗黙的に が無視されます。

キャッシュを使用する場合、JPAはそこからエンティティを取得します。 JPAを介して変更された場合にのみ、これらのエンティティの変更を追跡します。直接または他の外部システムを介して基礎となるデータを自分で更新する場合、JPAはこれらの変更を認識しません。

関連する問題