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

Spring Boot JPA自增ID失效:新增实体需手动指定ID

解决Spring Boot JPA实体ID无法自动递增的问题

我通过Flyway执行以下SQL在PostgreSQL中创建了speiseplan表:

CREATE TABLE speiseplan(
   ID SERIAL PRIMARY KEY,
   NAME varchar(50) NOT NULL,
   PREIS numeric(7,1),
   ART int,
   WOCHENTAG integer,
   CONSTRAINT fk_wochentage FOREIGN KEY(WOCHENTAG) REFERENCES wochentage(ID),
   CONSTRAINT fk_speisenart FOREIGN KEY(ART) REFERENCES speisenart(ID)
);

对应的JPA实体类SpeiseplanEntity如下:

@Entity
@Table(name = "speiseplan")
public class SpeiseplanEntity {
    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;
    @Column(name = "preis")
    private BigDecimal preis;
    @Column(name = "art")
    private String art;

    protected SpeiseplanEntity(){}

    // getter、setter及toString方法省略
}

现在新增实体时必须手动指定ID,否则会报错:

Identifier of entity '... .SpeiseplanEntity' must be manually assigned before calling 'persist()'

希望实现ID自动递增,无需手动指定。


解决方案

问题核心是实体类的ID字段未配置自动生成策略,JPA不知道该ID由数据库自增机制维护,因此要求手动赋值。针对PostgreSQL的SERIAL类型,只需给@Id字段添加对应注解即可。

1. 修改实体类ID字段注解

更新SpeiseplanEntity的ID字段配置:

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
  • @GeneratedValue(strategy = GenerationType.IDENTITY):告知JPA,ID值由数据库的自增逻辑生成(PostgreSQL的SERIAL本质是创建序列并将ID默认值绑定到序列,IDENTITY策略完美适配这种场景)。
  • 修改后新增实体时无需手动设置ID,JPA会自动忽略未赋值的ID字段,待数据库生成后将值回填到实体中。

2. 修复字段类型不匹配问题

实体类中art字段为String类型,但数据库表中ART字段是int类型,这会导致类型转换错误,建议同步修改:

@Column(name = "art")
private Integer art;

3. 测试修改后的请求

现在新增请求可以去掉id字段,直接提交:

POST http://localhost:8080/api/speise/createSpeise
Content-Type: application/json

{
  "name": "Test2",
  "preis": "13.5",
  "art": 1
}

这样就能实现ID自动递增,无需手动指定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:22:43