对于saveOrUpdate的正确使用

hibernate提供了saveOrUpdate的方法来进行数据库的操作。对于saveOrUpdate的解析,robbin有很精辟的文章了,这里不再重复,hibernate会根据对象的状态决定是insert还是update,其根本是通过xml文件中unsaved-value来确定的。 

如果设置null,系统会根据传入的对象的id的值判断,如果是null,则表示对象不存在,那么insert,如果不是Null,则表示已经存在,那么update 

如果设置为none,那么表示对象不存在,会始终调用insert 

如果设置为any,那么表示对象始终存在,会始终调用update 

了解这些后,在使用的过程中发现了一个问题,现在记录下来。原始目的是向数据库中添加一条数据,应该用到insert,这时在配置文件中定义了null,但是没有象预想的一样,而是抛出了Exception executing batch,发现hibernate的sql用的是update,怎么会这样呢? 

最后发现原因处在BeanUtils.copyProperties,我在ftl文件里面定义了一个form,
Java代码   收藏代码
  1. <@ww.form action="savegroup" method="post">  
  2.         <@ww.token />  
  3.         <@ww.hidden name="groupModel.id" value=null/>  
  4.         <@ww.textfield name="groupModel.name"   
  5.             label="Group Name"  
  6.             tooltip="${action.getText('reg.title.note')}"  
  7.             required="true" requiredposition="true"/>  
  8.         <@ww.textarea name="groupModel.desp"   
  9.             label="Group Description"  
  10.             tooltip="${action.getText('reg.username.note')}"  
  11.             required="true" requiredposition="true"/>  
  12.         <@ww.submit value="${action.getText('reg.submit')}"/>  
  13.     @ww.form>  
然后在action里面如下操作:
Java代码   收藏代码
  1. BeanUtils.copyProperties(groups, groupModel);  
问题就来了,当新增一调数据的时候,groupModel.id是空值,但是当BeanUtils.copyProperties后,就将null转换成了"",于是hibernate认为主键不为null,就转换成了update,异常就出来了。去掉form中id,一切正常了。

你可能感兴趣的:(Java)