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
相关产品推荐
相关产品推荐

