您的位置:首页 > 其它

hibernate的save,update,saveorupdate以及merge区别

2016-02-19 11:04 225 查看
内容参考文章:http://blog.csdn.net/qxs965266509/article/details/8800082

首先hibernate中的对象有三种状态:瞬时态(transient)、持久态(persistent)、游离态(detached),持久态的成为PO,其它的状态成为VO。

遇到的问题:

在结合springmvc实践时,对于页面更新的数据,使用update方法会产生如下错误:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:

主要原因是springmvc控制层接受的对象参数是new出来的,然后将页面各字段自动填充到对象属性中去,当执行update()方法时,由于session中已经存在标识相同的对象,因此会抛出异常。解决办法有两种:

1)利用springmvc的功能,在控制器添加@ModelAttribute方法,在该方法中先查询出对应id的对象,然后放入model中,这样控制器的对象参数就会直接使用查询出的对象,而不会new。因此就能避免错误产生。

2)将hibernate的update()方法改为merge(),具体原因在参考文章中有介绍,需要注意,该方法执行完毕后,merge的对象事实上依然为瞬时态,并没有转为持久态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: