Hibernate 先get 一个实体数据,在修改数据,为新的数据,再add到数据库,需要注意什么?
2013-02-23 17:48
676 查看
1、今天在做一个很简单的save操作的是,定位我一个小时,特在此废话下,现在从数据库中通过接口get到数据,代码如下
// 获取当前流程数据
TaskRunData taskRunDataOriginal = this.taskRunDataService.get(new Long(runTaskId));
然后对taskRunDataOriginal 进行修改些字段值,并且把主键设置为null了,这样就新增一条数据了。以为几秒的事,然后兴高采烈的调用save,
但是save的时候却出现,主键不能设置为空的异常,Ok我又重新new了一个TaskRunData 对象,把taskRunDataOriginal 中的数据重新构建了一下,这样我想估计Ok了吧。结果是OK了,新增了一条数据,但是多了一条SQL,就是执行update,把一开始获取到的数据更新了,也就是数据库中出现俩条一模一样的数据了(只是主键不一样)。
我这个郁闷啊。赶紧的google了下,没有发现啥,后来一想估计是一开始的 old对象是在session中取得的,所以这个对象已经和数据库同步了,或者说相关联了,那么修改,在spring事务提交,也会同时提交这个数据吧。ok,我就为TaskRunData这个JavaBean写了个clone方法,我先clone一个,然后再修改clone过来的数据,测试了一下,终于OK了。哎哎。教训啊
总结:从 getHibernateTemplate().get(this.persistType, id);中get到的数据,不要直接修改它的值,这样spring事务提交的时候,会update初始的数据。
如果要修改,请修改clone过来的数据
// 获取当前流程数据
TaskRunData taskRunDataOriginal = this.taskRunDataService.get(new Long(runTaskId));
然后对taskRunDataOriginal 进行修改些字段值,并且把主键设置为null了,这样就新增一条数据了。以为几秒的事,然后兴高采烈的调用save,
但是save的时候却出现,主键不能设置为空的异常,Ok我又重新new了一个TaskRunData 对象,把taskRunDataOriginal 中的数据重新构建了一下,这样我想估计Ok了吧。结果是OK了,新增了一条数据,但是多了一条SQL,就是执行update,把一开始获取到的数据更新了,也就是数据库中出现俩条一模一样的数据了(只是主键不一样)。
我这个郁闷啊。赶紧的google了下,没有发现啥,后来一想估计是一开始的 old对象是在session中取得的,所以这个对象已经和数据库同步了,或者说相关联了,那么修改,在spring事务提交,也会同时提交这个数据吧。ok,我就为TaskRunData这个JavaBean写了个clone方法,我先clone一个,然后再修改clone过来的数据,测试了一下,终于OK了。哎哎。教训啊
总结:从 getHibernateTemplate().get(this.persistType, id);中get到的数据,不要直接修改它的值,这样spring事务提交的时候,会update初始的数据。
如果要修改,请修改clone过来的数据
相关文章推荐
- Dynamics CRM 2011 通过数据库修改实体字段的长度需要注意的地方
- GET方式传递表单数据需要注意的一个问题
- 创建实体数据模型需要注意的,不要选单复数形式,否则AddObject出问题
- (日常打卡)自定义的一个模仿ArrayList的类, 你需要实现其中的add, get, remove , 等方法
- springMVC (hibernate)实体为关联时需要注意的情况
- 抓取数据需要注意什么
- 数据库保存经纬度,需要采用什么数据类型,小数点应该精确多少位?
- 解决getHibernateTemplate().save ()不能将数据保存到数据库的问题
- Hibernate插入和修改数据到数据库中时不修改存在默认值字段
- 转载!!!Hibernate插入和修改数据到数据库中时不修改存在默认值字段
- 还在为数据库不能获取最新数据而犯愁?信我,你只是需要一个活着的数据库——Realm
- web数据采集核心技术分享系列(一)做一个强大的web数据采集系统,你需要什么?
- 购买一个虚拟主机你需要注意什么
- 这是一个求两数之和的题目,输入多对用空格分开的两个数a b,输出a+b的和,每一对数据的和占一行。编写代码时需要注意的是,由于没有指出有多少对输入数据,因此我们可以编写如下代码:
- 执行了getHibernateTemplate.save(user)后,控制台有hql语句输出,显示已经将数据存到数据库了,也没有抛出异常,但是去oracle数据库查的时候,压根就没有数据。。。。请问
- 策划一个企业网站需要注意什么?
- Hibernate插入和修改数据到数据库中时不修改存在默认值字段
- 关于JPA封装数据库数据到实体不调用属性的get和set的方法解决办法
- Kooboo中如何切换数据库(注意:如果切换数据库,需要Kooboo中没有一个website 否则会报错数据库中没有表之类的)
- getHibernateTemplate().save();不能保存数据到数据库解决办法