Hibernate 先get 一个实体数据,在修改数据,为新的数据,再add到数据库,需要注意什么?

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过来的数据


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值