开发者社区> 问答> 正文

使用spring data jpa保存两次entity?报错

原来是希望第一次保存的时候获取到id,然后根据id生成一个内部编码,再回写回数据库。但是要在一个事务里完成。

结果报错了,提示:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

各位给点建议

展开
收起
爱吃鱼的程序员 2020-06-12 15:20:24 2198 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    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设置到你的要保存的对象中


    不是你说的这个问题,我是save以后,再重新findOne,再对findOne返回的对象进行修改,再save依然有问题这个是合理的啊  同一个对象保存两次???是什么道理  把id转换成一个字符串,需要先insert进数据库才有id第一次用saveAndFlush试下?最后放弃使用@Version了,就没问题了jpa要用merge,persistent之类的吧!springdatajpa的CrudRepository.save已经替你实现了merge和persist

    表示不用version 也有这样的问题。线程保存1个实体,触发器监听插入操作,也保存同一个实体到另外的表。然后就报错了 org.springframework.orm.ObjectOptimisticLockingFailureException:Batchupdatereturnedunexpectedrowcountfromupdate[0];actualrowcount:0;expected:1;nestedexceptionisorg.hibernate.StaleStateException:Batchupdatereturnedunexpectedrowcountfromupdate[0];actualrowcount:0;expected:1

    2020-06-12 15:20:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多