Spring JPA保存实体时自动递增someId而非使用指定值的问题
问题解决:JPA保存时保留指定的someId而非自动递增
问题场景
已存在数据库中的SomeEntity记录:
{ "somePK": { "someId": 123456, "seqNum": "1" }, "integrationId": "123456-123456" }
尝试插入的新记录:
{ "somePK": { "someId": 123456, "seqNum": "2" }, "integrationId": "123456-123456" }
实际保存后得到的结果:
{ "somePK": { "someId": 123457, "seqNum": "2" }, "integrationId": "123456-123456" }
问题原因
嵌入式主键类SomePK中的someId字段被标注了@GeneratedValue(strategy = GenerationType.SEQUENCE),JPA会自动调用指定序列生成新值,覆盖你手动设置的someId,无论是否传入了具体值。
解决方案
方案1:移除自动生成注解(推荐,若无需全局自动生成someId)
直接修改SomePK类,删除@GeneratedValue和@SequenceGenerator注解,让JPA完全使用你传入的someId值:
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @Embeddable public class SomePK { @Column(name = "SOME_ID", nullable = false, precision = 38, scale = 0) private BigInteger someId; @Column(name = "SEQ_NUM", nullable = false, scale = 0) private Long seqNum; }
方案2:保留部分场景自动生成(按需选择)
如果需要在部分场景自动生成someId,部分场景手动指定,可以通过以下方式处理:
- 确保手动传入的实体主键(
someId+seqNum)完整且唯一 - 使用
EntityManager.persist()替代JpaRepository.save(),因为save()会先判断实体是否存在,而persist()仅处理新建实体,避免触发序列生成逻辑
同时需检查数据库表结构:确保SOME_ID字段未设置数据库层面的自增或序列默认值,否则即使去掉注解,数据库仍会自动生成值。
验证
修改后调用saveSomeEntity方法传入指定someId的实体,数据库将插入someId=123456、seqNum=2的新记录,不会自动递增someId。
内容的提问来源于stack exchange,提问作者jpedropsilva2010
相关产品推荐
相关产品推荐

