2016-04-03 79 views
0

我在DAO像下面的方法,JPA当更新实体

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

我想ENTITY2包含值更新使用实体,在方法结束时,我发现使用实体的ATTR成功更新,但在数据库没有改变? 这种方法有什么问题吗?

+1

您需要提交您的交易。 – aribeiro

+0

我只是解决了这个问题:Entity1 = entitymanager.find(....); em.clear();当我添加clear()方法时,Entity1将在数据库中成功更新,但我不知道为什么,任何人都可以解释它? –

回答

0

感谢您的帮助。 我发现有趣的原因,它是关于搜索缓存:

由于以前的搜索,例如,Entity1处于缓存中。它是attr = 1;

但在另一个事务,这是attr属性就是设置好的为2,所以缓存数据是脏数据,

以上我只是想设置ENTITY1 ATTR回到1,但缓存的数据仍然是1,那么JPA我以为我没有做任何改变,所以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(); 
}