如何将一个特定属性更新到数据库,而不将其余属性覆盖为NULL

时间:2013-03-06 15:01:30

标签: database hibernate hibernate-mapping

我想更新数据集的UserData属性之一(名称,街道,城市等) 这样:

关系&数据库属性: 此UserData与其用户具有双向关系,其中使用了User.hbm.xml上的cascade =“save-update”,因此

用户在DB中具有此属性(id_user,外键: id_UserDetail,status)

UserData 有(id_UserDetail,外键: id_User,经典信息字段名称,街道,电话等)

我使用此方法更新到数据库: 更新方法

public void ajaxNameListener(AjaxBehaviorEvent event) {         

             UserData usrData = new UserData();
             userData.setName(name);  // I want update only name property,but unfortunately rest is also overwriten to null in DB

                 User user = BeanFactory
                        .getHotelDAOService(User.class)
                         .findbyIdIndetifier(selectedUserId);   // selectedUserId is just identifier from my list of user,so here i declared which concrete User be updated by Id of Users           

                    user.setUserData(userData);
          BeanFactory.getHotelDAOService(User.class)
                    .update(user);
}

此方法在我的Jsf页面上用作监听器表单<a4j:>但是没有问题,

我需要以某种方式修复此方法只更新此DB字段我需要什么,休息必须是未加工的,但在这种情况下我成功地更改了例如字段'name'这个更新字段名称由specialy Id,但其余的UserData列被覆盖为NULL,

有人可以给我一些建议怎么修改这个方法?或者可以根据这种情况编写自己的方法,这会导致我只想更新我要更新的字段,而不是在数据库中休息为NULL, 非常感谢你的帖子和回复, 欢呼声,

1 个答案:

答案 0 :(得分:0)

发生此问题是因为在您保存/更新用户的实例时,它没有其FK属性的值。所以FK属性的值变为空。

为避免这种情况,您可以按照以下方式进行操作:

  1. 不使用hibernate API更新实例,而是编写HQL以仅修改要更改的属性。 (例如你的名字。)
  2. 从hibernate会话加载User实例,更改该实例中所需属性的值,更新User实例。所有这3个操作必须在一个休眠会话中完成。