如何合并而不覆盖不在参数(JPA)中的列?

时间:2014-04-01 11:00:51

标签: java jpa

我有一个名为

的表
Customer

Custid:
Custusername:
Custaddr:
CustDateOfBirth:

现在,我有一个更新参数,希望用户只更新“Custusername,Custaddr”更新Dateofbirth是没有意义的(因此在注册后,它是永久性的。)

所以我这样做:

Customer.setCustid(Custid);
Customer.setCustaddr(Custaddr);
Customer.setusername(Custid);

然后我使用实体经理:

em.merge(Customer);

所以会发生什么,细节会更新但是!无论我没有为其设置任何参数, Dateofbirth 现在在数据库中为空。

之前我做过这个,但是方法返回true而不做任何更改:

//The Set statements are above
emm.getTransaction().begin(); 
try {  
    emm.merge(emm.find(Customer.class, Custid);
    emm.getTransaction().commit();
    return true;
} catch (Exception e) {
    emm.getTransaction().rollback();
    System.out.println( e);
    return false;
}  

2 个答案:

答案 0 :(得分:0)

您是如何创建客户的?您需要按ID查找客户,然后更改它并将其合并回db

 Customer c = em.find(Customer.class, id);
 c.setCustaddr(custaddr);
 em.merget(c);

现在您正在创建一个全新的实体并将其与旧实体合并,所有字段都被数据库中的新实体覆盖,这是合乎逻辑的。

答案 1 :(得分:0)

查看动态更新属性。

@org.hibernate.annotations.Entity(dynamicUpdate=true)

dynamic-update(可选 - 默认为false):指定应在运行时生成UPDATE SQL,并且只能包含值已更改的列。