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的对象事实上依然为瞬时态,并没有转为持久态。
首先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的对象事实上依然为瞬时态,并没有转为持久态。
相关文章推荐
- Integer与int的区别
- iOS开发——关于拷贝的iOS工程在其他电脑上不能真机和模拟器运行,即只有MyMac设备,没有其他设备
- 【Linux--中级篇】MFS分布式文件系统
- C++标准模板库
- CSS3选择器(全)
- "=="和equals和equalsIgnoreCase三者的区别
- Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 'XXX'.
- 代码审查工具 StyleCop 的探索
- dispatch_async 和dispatch_sync
- kill -9杀掉nginx主进程、reload失败解决办法
- odoo8编辑视图中sheet边距过宽问题调整
- Xcode 7.2.1 下载地址
- iOS NSDictionary初始化问题
- PDO参数化查询
- 宏小知识
- 对于Sqlite,删除Sqlite数据库中的所有表
- spring注解autowired与resource的区别
- 移动应用是大势所趋,微信开发初步研究尝试(图文)
- 将自己项目作为module导入
- 第四篇 扩展篇—哈哈,终于等到这一天! 第26回 主公,我来考考你