【问题标题】:Error: Delete then insert using JPA in single transaction错误:在单个事务中使用 JPA 删除然后插入
【发布时间】:2013-12-17 17:44:02
【问题描述】:

使用 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

【问题讨论】:

    标签: mysql hibernate jpa


    【解决方案1】:

    您的 User 实体中有一个带有 @Version 注释的字段,该字段精确地用于乐观锁定,确保当您更新用户时,您在用户对象中传递的版本与存储在数据库。

    但你不是,因为你正在从头开始创建一个已经存在于数据库中的用户,其版本字段具有其默认值。所以你得到了这个异常。

    【讨论】:

    • 感谢 Nizet 的快速回复。我需要删除一条用户记录并在同一事务中插入另一条用户记录。但是在插入时,它会显示更新查询。我需要对代码进行哪些更改?
    • 它显示了一个更新查询,因为您正在使用 merge(),并且您正在传递一个带有 ID 的实体,因此该 ID 应该已经存在于数据库中。如果要插入实体,则使用persist(),并且不要指定任何ID:让Hibernate 生成ID。提供实体的代码并告诉用户表包含的内容会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多