硬设置实体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
相关产品推荐
相关产品推荐

