对于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,
<@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,一切正常了。

你可能感兴趣的:(sql,xml,Hibernate)