原来是希望第一次保存的时候获取到id,然后根据id生成一个内部编码,再回写回数据库。但是要在一个事务里完成。
结果报错了,提示:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
各位给点建议
findone之后要更新对象的值才可以否则乐观锁会认为是执行了2次 所以报错。是说要用EntityManagerrefresh一下吗看代码怎么写的
save方法他本身就会做判断,jpa里面是没有update方法的,,若实体中存在id,他会到数据库中看是否存在,存在则修改,不存在则添加,修改的时候需要对version进行处理,否则会报错,
//修改之前先查询数据库中最新的数据
Objectold=objDao.findOne(id);
BeanUtils.copyProperties(要修改的对象,old,newString[]{"version"});
objDao.save(<spanstyle="font-size:13.3333330154419px;">old);
这话的意思是将你要修改的对象的属性复制到数据库中最新的那个对象里,但是version不复制,那么version就是最新的,你也可以将version设置到你的要保存的对象中
表示不用version 也有这样的问题。线程保存1个实体,触发器监听插入操作,也保存同一个实体到另外的表。然后就报错了 org.springframework.orm.ObjectOptimisticLockingFailureException:Batchupdatereturnedunexpectedrowcountfromupdate[0];actualrowcount:0;expected:1;nestedexceptionisorg.hibernate.StaleStateException:Batchupdatereturnedunexpectedrowcountfromupdate[0];actualrowcount:0;expected:1
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。