Java 使用Hibernate仅更新特定列

Java 使用Hibernate仅更新特定列,java,hibernate,struts2,sql-update,Java,Hibernate,Struts2,Sql Update,我使用struts2作为前端,Hibernate3.0作为ORM。我想根据所选下拉列表更新客户地址。除PIN外,所有字段均为必填字段。如果用户正在更新地址并将PIN保留为空,则PIN也会使用状态等更新。 如果PIN为空,我不想更新PIN。如何实现这一点,Hibernate是否有任何东西可以更新特定的列 if(getPin()==null||getPin()=="") { @update(false) //make update false } 查看代码片段了解我的问题。我建议您在对象

我使用struts2作为前端,Hibernate3.0作为ORM。我想根据所选下拉列表更新客户地址。除PIN外,所有字段均为必填字段。如果用户正在更新地址并将PIN保留为空,则PIN也会使用状态等更新。 如果PIN为空,我不想更新PIN。如何实现这一点,Hibernate是否有任何东西可以更新特定的列

if(getPin()==null||getPin()=="")
{
    @update(false)  //make update false
}

查看代码片段了解我的问题。

我建议您在对象的setPinString pin方法中处理逻辑

你可以这样做

 public void setPin(String pin){
   if(pin != null && !pin.isEmpty()){
        this.pin = pin;
     }
 }

你唯一要做的就是

1装载客户 2将所有更改的字段复制到仍然受管的对象中,pin为空时除外

仅仅将分离的实体与空字段合并是不够的,因为hibernate无法判断是否要删除它


考虑使用类似于Dozer的框架来实现这一点。

如果用户正在更新地址,并将PIN保留为空,则PIN也会使用状态等更新。如果PIN为空,我不想更新PIN。这两句话出现了contradictory@subin,查看用户是否正在更新其地址,然后他必须选择州、区、曼德尔、村庄,这些是必需的,但Pin是可选的。若用户将Pin保留为空,假设他在数据库中的前一个Pin=400038,现在他正在更新地址,那个么Pin也会更新为Pin=Ok,现在就清楚了。你应该试试@null的答案他说的是试试我的答案我的| |应该是&。我更改了它。您的if语句是否与我的完全相同。切勿向getter和setter添加逻辑,因为这可能会损害代码的可维护性。许多框架(如Hibernate)依赖于实体作为POJO。通过添加语义,您可能会失去正确使用这些框架的可能性。在您的示例中,您刚刚排除了重置密码的可能性,并且在使用Dozer(例如)创建对象副本时,您失去了复制空字符串的功能。这听起来可能不是很糟糕,但在一个涉及更多框架的大型系统中,承诺一下,在向POJO添加语义时,您会遇到一些非常严重的错误。理论上,向对象添加逻辑没有什么错,但不应该在属性访问器中。