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,一切正常了。
分享到:
相关推荐
Hibernate merge、update与saveOrUpdate方法的区别
saveOrUpdate
HibernateTemplate.saveOrUpdate时出现\xE7\x84十六进制之类的字符串,连接数据库字符串,数据库字符集,汉字乱码的问题集合,还有我熬3夜的血泪经历
05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法
在Hibernate中,最核心的概念就是对PO的状态管理。
博文链接:https://log-cd.iteye.com/blog/205166
我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原因。 假如两个实体之间有关系(例如employee表和address表有一对一关系),如果在没有事务的情况下调用这个方法保存employee这个实体,...
在这个项目中简单实现了springboot对redis缓存,Mybatis-Plus,mongodb等数据库相关的技术点,实现数据获取,可以直接在以后的项目中仿照使用。并且整合了exsyexcel等数据文件导入导出功能,后续会继续汇总整合一些...
在我们程序当中调用save,update,get,load,saveOrUpdate,merge,list c:游离状态(脱管状态) 对象从session作用域分离出来的时候我们叫做游离(脱管) 即:调用delete,clear,evict等方法时
Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别 用代码演示三种代理 stackoverflow错误,permgen space错误 分代收集算法 同步方法和同步块,哪个是更...
public class UserDAO extends HibernateDaoSupport implements IUserDAO { public void insertUser(User user) { getHibernateTemplate().saveOrUpdate(user); } } <br> 上面的...
主要介绍了Mysql 原生语句中save or update 的写法汇总,非常详细,需要的朋友可以参考下
Hibernate持久层方法汇总 session.load, session.find, session.iterator, session.save, session.update, session.saveorupdate
1.7. update()和saveOrUpdate()的区别? 4 1.8. hibernate拒绝连接、服务器崩溃的原因?最少写5个 4 1.9. hibernate如何管理缓存 4 1.10. 使用Hibernate的优点: 6 1.11. Hibernate是如何延迟加载? 6 1.12. ...
05_实体对象的三种状态与saveOrUpdate方法 06_完善HibernateUtil类及hql查询入门 07_实体类或属性名与数据库关键字冲突问题 10_使用Hibernate完成CRUD实验的步骤说明 11_完成CRUD实验并回顾和补充细节知识(上)...
Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)
事实上针对单个对象的get/load/persist/save/update/merge/saveOrUpdate API和Criteria API本来就为一体,只不过是历史的原因被人为割裂成为两套数据库操作API罢了。 因此,对于关系型数据库而言——Entity和...