SSH hibernate 生命周期怎么破

时间:2021-04-10 09:00:18

public void update( Contractproduct contractproduct ) throws DataAccessException
    {

Contractproduct tmp = contractproductDao.getById( contractproduct.getContractproductId() );


contractproduct.setContractproductSnum( contractproduct.getContractproductNum().subtract( tmp.getContractproductNum() ).add( tmp.getContractproductSnum() ) );
contractproduct.setContractproductCnum( contractproduct.getContractproductNum().subtract( tmp.getContractproductNum() ).add( tmp.getContractproductCnum() ) );

getEntityDao().update( contractproduct );



update方法接收了一个从页面修改好传回来的对象,在update这个对象之前,这个对象里面有两个属性需要通过查出没修改时这两个属性的值并加以运算,这样貌似不符合hibernate的持久态,所有报错
更新失败org.springframework.dao.DuplicateKeyException: a different object with the same identifier value was already associated with the session: [com.dfgg.erp.model.Contractproduct#4]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.dfgg.erp.model.Contractproduct#4]
怎么破

5 个解决方案

#1


hibernate 从数据库 get一个 对象出来 然后修改对象的一些属性  先不update 这时怎么知道这些属性没改之前是什么样子 如果这时再从数据库get他一下 update的时候 报相同id的错误

#2


你的dao里面 用了 同一个session对象 session是单例的 你在每个dao中都重新定义session对象 就可以解决了

#3


你要保存的对象错了,不是你页面端传递过来的那个,而是你查出来的那个知道不
getEntityDao().update( tmp);你的应该是肯定配置了openSessionInViewFilter,这个东西会让session在同一个request中不关闭,这样的话你先前查询了一次,这个时候已经打开了session, a different object with the same identifier value was already associated 这个错误表是hibernate中已经存在了一个ID和你保存的对象的ID是一致的,所以你的持久化对象应该是tmp,而contractproduct 则是个瞬态的

#4


duplicatekey,,重复的主键

#1


hibernate 从数据库 get一个 对象出来 然后修改对象的一些属性  先不update 这时怎么知道这些属性没改之前是什么样子 如果这时再从数据库get他一下 update的时候 报相同id的错误

#2


你的dao里面 用了 同一个session对象 session是单例的 你在每个dao中都重新定义session对象 就可以解决了

#3


你要保存的对象错了,不是你页面端传递过来的那个,而是你查出来的那个知道不
getEntityDao().update( tmp);你的应该是肯定配置了openSessionInViewFilter,这个东西会让session在同一个request中不关闭,这样的话你先前查询了一次,这个时候已经打开了session, a different object with the same identifier value was already associated 这个错误表是hibernate中已经存在了一个ID和你保存的对象的ID是一致的,所以你的持久化对象应该是tmp,而contractproduct 则是个瞬态的

#4


duplicatekey,,重复的主键