日期:2014-05-16  浏览次数:20411 次

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