2016-09-03 2 views
1

リアルタイムアプリケーションを構築し、エンティティリスナを使用して状態を最新の状態に保ちようとしています。基本的な考え方は、ビジネスロジックの領域が変わるたびに、影響を受けるエンティティをリロードし、変更を調整することです。ここにMWEがあります:Hibernate JPAエンティティリスナ@Preと@Postが期待どおりに動作しない

@PrePersist 
public void PrePersist() { 
    LoggerFactory.logger(App.class).info(" >>> PrePersist count: " + getStars().size()); 
} 
@PostPersist 
public void PostPersist() { 
    LoggerFactory.logger(App.class).info(" >>> PostPersist count: " + getStars().size()); 
} 
@PreRemove 
public void PreRemove() { 
    LoggerFactory.logger(App.class).info(" >>> PreRemove count: " + getStars().size()); 
} 

@PostRemove 
public void PostRemove() { 
    LoggerFactory.logger(App.class).info(" >>> PostRemove count: " + getStars().size()); 
} 
private List<Star> getStars() { 
    EntityManager em = HibernateUtilJpa.getEntityManager(); 
    List<Star> l = new ArrayList<Star>(); 
    try { 
     em.getTransaction().begin(); 
     l = em.createQuery("from Star", Star.class).getResultList(); 
     em.getTransaction().commit(); 
    } catch (Exception e) { 
     em.getTransaction().rollback(); 
    } finally { 
     em.close(); 
    } 
    return l; 
} 

DBに星を挿入/削除するために別のAPIを使用しています。私は、ポスト・サスティンが追加されたアイテムのために1つ以上のアイテムを表示し、ポスト・リムーバルがプレ・リムーバルより1つ少ないことを期待していました。これはそうではありません。ポスト・サスティングとポスト・リムーバルの両方でアイテムの数が正しくないので、プリ・パーシストはポスト・サスティンと同じで、プレ・リムーバルは削除後と同じです。私はそれがHibernateのキャッシングに関係していると確信していますが、私はトランザクションを使用しており、すべてがEntityManagerを通過するので、私は頭を傷つけています。

答えて

1

documentationから:

コールバックメソッドが EntityManagerまたは Queryメソッドを呼び出す必要がありません!

実際に行った場合の動作は定義されていません。そのため、例の中で観察した結果です。

関連する問題