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

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列带自增属性:

  1. 删除本地H2数据库文件(路径为~/fitnessapp.mv.db)
  2. 修改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;

验证步骤

  1. 重启应用后,通过H2控制台查看workout表结构,确认id列带有AUTO_INCREMENT标识
  2. 发送不带id字段的POST请求,检查是否能成功插入并返回自动生成的主键值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:50:27