You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

硬设置实体ID时的乐观锁问题及解决方案咨询

问题:Spring/JPA/Hibernate手动指定ID持久化实体失败

业务场景:需要从Envers中获取先前分配的ID,用于新添加的实体记录,尝试手动设置ID后进行持久化操作时遇到错误。

模型代码

import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Column;
import jakarta.persistence.Version;
import jakarta.persistence.Entity;

@Entity
public class ModelObject {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Version
    @Column(nullable = false)
    private Integer version;

    // 省略构造方法、getter/setter等其他代码
}

持久化代码

Long retrievedId = ...; // 从Envers获取的历史ID
ModelObject newObject = new ModelObject();
newObject.setId(retrievedId);
newObject.setVersion(0);
crudRepository.save(newObject);

遇到的错误

  • 执行上述代码后报错:row was already updated or deleted by another transaction
  • 尝试使用entityManager.merge(newObject) + entityManager.persist(newObject)组合操作,错误未解决
  • 将version设为null时,触发错误:Detached entity with generated id ... has an uninitialized version value 'null'

需求

已通过原生查询解决问题,但希望了解不使用原生查询的更简洁实现方式。

内容的提问来源于stack exchange,提问作者Gev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:05:56