2007-06-21
对于saveOrUpdate的正确使用
关键字: hibernate 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,
如果设置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,一切正常了。
发表评论
- 浏览: 101030 次
- 来自: 北京

- 详细资料
搜索本博客
我的相册
IMG_7195
共 46 张
共 46 张
最近加入圈子
最新评论
-
北京太乱了,求你,别来了 ...
深有感触。。。
-- by zisidemao -
【收藏】通过js调用WebSer ...
Where's http://localhost/accountws/servi ...
-- by dayrl -
Xfire在Spring下实现安全 ...
开源否开源社区:http://www.kaiyuanfou.com有更详细的说明
-- by zhongludeng -
Xfire在Spring下实现安全 ...
开源否开源社区:http://www.kaiyuanfouc.com有更详细的说 ...
-- by zhongludeng -
关于EhCache的使用
:o :lol: :cry: :wink:& ...
-- by dsl_0375






评论排行榜