对于saveOrUpdate的正确使用

本文探讨了Hibernate中saveOrUpdate方法在特定场景下引发的问题。当使用BeanUtils.copyProperties进行属性复制时,若主键字段由null变为,会导致Hibernate误判为更新操作而非插入。文中详细解释了这一现象,并给出了相应的解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.formaction="savegroup"method="post">
  2. <@ww.token/>
  3. <@ww.hiddenname="groupModel.id"value=null/>
  4. <@ww.textfieldname="groupModel.name"
  5. label="GroupName"
  6. tooltip="${action.getText('reg.title.note')}"
  7. required="true"requiredposition="true"/>
  8. <@ww.textareaname="groupModel.desp"
  9. label="GroupDescription"
  10. tooltip="${action.getText('reg.username.note')}"
  11. required="true"requiredposition="true"/>
  12. <@ww.submitvalue="${action.getText('reg.submit')}"/>
  13. </@ww.form>
然后在action里面如下操作:
Java代码收藏代码
  1. BeanUtils.copyProperties(groups,groupModel);
问题就来了,当新增一调数据的时候,groupModel.id是空值,但是当BeanUtils.copyProperties后,就将null转换成了"",于是hibernate认为主键不为null,就转换成了update,异常就出来了。去掉form中id,一切正常了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值