今天遇到一个问题,要求是对数据库的某一条数据进行克隆,只有id主键不一样,我的代码思路如下:service层加入事务;查询一个对象后(已变成持久化对象),再对这个对象重新setId(xx);再执行save(),结果报错 :org.springframework.orm.hibernate4.HibernateSystemException: identifier of an instance of
com.gboss.pojo.Supplycontracts was altered from 7ffb636e809942dba8075996186bad41 to 9c3195694d884feebcd839e2371a8bc8;
原因是先查出对象,再save时,发生了脏数据处理,因为查出来的是持久化对象,再set重新赋值,就修改了数据库中的值,可是后面又进行save,save在操作持久化对象时,不会执行,就会报错,所以这种情况,有2种办法解决;
第一查出来的对象由持久化变成托管状态,可利用,session.flush();session.evict(obj)方法;
第二:把查出来的对象由持久化对象变成瞬时态对象,可再重新new 一个对象,再赋值,再保存即可;