2016-04-03 15 views
0

が、私は以下のようにDAOのメソッドを持って、JPA更新エンティティ

public void updateEntity1(Entity2) { 
    Entity1 = entitymanager.find(....); 
    Entity1.setAttr(Entity2.getAttr()); 
    ......... 
    entitymanager.merge(Entity1); 
    em.flush(); 
} 

私はentity2が含まれている値とentity1を更新したいが、方法の終わりに、私はentity1のattrが正常に更新を見つけるが、中データベースは変更されていませんか? この方法に問題がありますか?

+1

トランザクションをコミットする必要があります。 – aribeiro

+0

私はちょうどこの問題を解決します:Entity1 = entitymanager.find(....); em.clear();私はclear()メソッドを追加すると、Entity1はDBで正常に更新されますが、理由はわかりません。 –

答えて

0

おかげで。興味があるのは、検索キャッシュに関することです。

エンティティ1は以前の検索のためにキャッシュに入っていました。それはattr = 1です。私は戻って1にEntity1のattrを設定したいのですが、キャッシュデータがJPAので、まだ1である上

が、別のトランザクションでは、それはattrが2にsettedたので、キャッシュデータがダーティデータであるのです

私は何も変更していないと思ったので、em.merge()は何もしません。

これはかなり印象的です!

1

次のようにトランザクション内でコードを囲む試してみてください。

entityManager.getTransaction().begin(); 
....//your code 
entityManager.getTransaction().commit(); 
0

トランザクションがすでに利用可能である場合には(そうでない@MadhusudanaレディSunnapuソリューションを試してください)で試してみてください。助けを

public void updateEntity1(entity2) { 
    Entity1 entity1 = entitymanager.find(...); 
    Entity1.setAttr(entity2.getAttr()); 
    ... 
    entity2.detach(); 
    entitymanager.merge(entity1); 
    em.flush(); 
} 
関連する問題