Spring Boot整合JPA与H2时自增ID列NULL不允许的问题
解决Spring Boot + H2 自增主键插入NULL报错问题
核心原因
你的id字段使用基本类型int,默认值为0,Hibernate会将0视为明确的主键值而非“未设置”,导致尝试向自增列插入非自增值;同时日志显示的NULL报错,是因为H2的自增列不允许手动传入NULL,而Hibernate错误地将未正确识别的主键值转为NULL提交。此外,需确保H2表的id列确实被配置为自增类型。
解决方案
方案1:将主键类型改为包装类Integer
修改实体类的id字段类型为Integer,使其默认值为null,让Hibernate识别出这是未设置的主键,从而触发H2的自增机制:
@Entity @Getter @Setter public class Workout { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; // 替换原int类型 private String user; private LocalDateTime start; private LocalDateTime end; private int difficulty; }
方案2:强制重新生成自增表结构
如果不想修改字段类型,可通过重新生成表结构确保id列带自增属性:
- 删除本地H2数据库文件(路径为
~/fitnessapp.mv.db) - 修改
application.properties中的DDL配置:
spring.jpa.hibernate.ddl-auto=create
重启应用后,Hibernate会生成带有AUTO_INCREMENT属性的id列,此时int类型的主键也能被正确处理。
方案3:显式指定Hibernate生成器
在实体类中显式配置适配H2的自增生成器,配合create类型的DDL配置使用:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "h2-id-generator") @GenericGenerator(name = "h2-id-generator", strategy = "identity") private int id;
验证步骤
- 重启应用后,通过H2控制台查看
workout表结构,确认id列带有AUTO_INCREMENT标识 - 发送不带
id字段的POST请求,检查是否能成功插入并返回自动生成的主键值
内容的提问来源于stack exchange,提问作者jpappe
相关产品推荐
相关产品推荐

