2013-03-06 47 views
0

我想更新databgase其具有的UserData属性(名称,街道,城市等)的一个 这样:如何更新一个特定属性数据库,无需重写为NULL,其余性能

关系& DB属性: 该用户数据与他的用户的双向关系,其中级联=“保存更新”上User.hbm.xml被使用,所以

用户有这种性质的DB(id_user,外交关键: i d_UserDetail,状态)

的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); 
} 

此方法用于为收听形式<a4j:>我的JSF页面上,但没有问题与此,

我需要修复此方法以某种方式更新只有这个数据库字段我需要和休息必须解开,但在这种情况下,我成功地作出了例如字段'名称'这个更新字段名称由特殊Id的变化,但其余的UserData列被覆盖为NULL,

有人可以键入我的一些建议如何修改此方法?或者可以基于这种情况下,导致仅更新这个领域我想更新写自己的方法,而不是休息到数据库NULL, 感谢很多关于你的帖子及回复, 欢呼声,是因为在

+0

你可以尝试从数据库中提取'UserData'而不是创建新的'UserData'。 – 2013-03-06 17:05:17

+0

嗯,你能不能澄清我这个?我尝试只更新单个字段,但上面的方法也会将其余的字段重写为null,例如我想更新名称,其他属性也正在更新,但空,不知何故需要更新只有单个字段,不知道如何 – ViliDuarte1 2013-03-06 18:03:10

+0

@ ViliDuarte1你如何绑定你的数据库字段?你能展示一些jsf,hibernate-mapping文件的片段吗? – 2013-03-06 18:59:24

回答

0

这个问题当你保存/更新用户的实例时,它的FK属性没有值。所以FK属性的值变为null。

为了避免这种情况,你可以按照下面提及的两种方式:不要使用休眠API,写的HQL仅修改要更改的属性更新实例的

  1. 。 (例如,在您的情况下命名)。
  2. 从hibernate会话中加载用户实例,更改该实例中所需属性的值,更新用户实例。所有这3个操作必须在单个休眠会话中完成。
+1

谢谢你这个选项,我解决了这个把htm-update =“true”放在hbm.xml文件中,但工作就像我更新eg'telephone'.a stacktrace发生,并告诉'名称'不能为空(我有这个设置在数据库中的NOT NULL),所以也许仍然覆盖了一个未修改的值,如'name' – ViliDuarte1 2013-03-07 10:30:42