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,
<@ww.form action="savegroup" method="post">
<@ww.token />
<@ww.hidden name="groupModel.id" value=null/>
<@ww.textfield name="groupModel.name"
label="Group Name"
tooltip="${action.getText('reg.title.note')}"
required="true" requiredposition="true"/>
<@ww.textarea name="groupModel.desp"
label="Group Description"
tooltip="${action.getText('reg.username.note')}"
required="true" requiredposition="true"/>
<@ww.submit value="${action.getText('reg.submit')}"/>
</@ww.form>
然后在action里面如下操作:
BeanUtils.copyProperties(groups, groupModel);
问题就来了,当新增一调数据的时候,groupModel.id是空值,但是当BeanUtils.copyProperties后,就将null转换成了"",于是hibernate认为主键不为null,就转换成了update,异常就出来了。去掉form中id,一切正常了。