使用JPA和mysql,我想编写使用@Transaction注释在单个事务中删除和插入表的程序
我的代码是这样的
//Delete
entityManager.createNamedQuery( "DELETE_QUERY" ).setParameter( "userId", userId ).executeUpdate();
entityManager.flush();
//Insert
User user = new User();
user.setUserId(122);
user.setPassword("test");
entityManager.merge( user );
entityManager.flush();
显示删除查询。然后更新查询在这里运行...然后它抛出下面提到的错误
............
javax.persistence.OptimisticLockException:org.hibernate.StaleStateException:批量更新从更新[0]返回意外的行计数;实际行数:0;预期:1
............
原因:org.hibernate.StaleStateException:批量更新从更新 [0] 返回意外的行计数;实际行数:0;预计:1 ............ ............ org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常是 javax.persistence.RollbackException:事务标记为 rollbackOnly
最佳答案
您的 User 实体中有一个用 @Version
注释的字段,该字段正是用于乐观锁定,确保当您更新用户时,您在用户中传递相同的版本对象作为存储在数据库中的对象。
但你不是,因为你正在从头开始创建一个已经存在于数据库中的用户,其版本字段具有默认值。所以你会得到这个异常。
关于mysql - 错误: Delete then insert using JPA in single transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20321144/