使用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:批量更新从update [0]返回意外的行数;实际行数:0;预期:1
...............
引起:org.hibernate.StaleStateException:批量更新从update [0]返回意外的行数;实际行数:0;预期:1 ............... ............... org.springframework.transaction.TransactionSystemException:无法提交JPA事务;嵌套异常是javax.persistence.RollbackException:事务标记为rollbackOnly
答案 0 :(得分:1)
您的用户实体中有一个用@Version
注释的字段,该字段精确用于乐观锁定,确保在更新用户时,您在用户对象中传递的版本与存储在数据库中。
但是你不是,因为你正在创建一个从头开始存在于数据库中的用户,其版本字段具有默认值。所以你得到了这个例外。