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

Hibernate通过CrudRepository插入数据时ID为NULL报错求助

解决Spring+H2数据库ID自动生成失败的问题

问题根源

你手动创建的message表中,id字段仅设置为非空主键,但未配置自增属性。Hibernate的@GeneratedValue注解需要数据库端支持自动生成主键值,否则插入时会因实体类未赋值、数据库也不自动生成,导致ID为NULL触发错误。

具体解决方案

  1. 修改数据库表结构,添加自增属性
    H2数据库中,给主键字段加上AUTO_INCREMENT即可支持自动生成ID:

    -- 新建表时的正确语句
    CREATE TABLE `message` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `body` CLOB,
      `channels` varchar(500) NOT NULL,
      `end_date` datetime DEFAULT NULL,
      `start` datetime DEFAULT NULL,
      `status` varchar(120) DEFAULT NULL,
      `title` varchar(120) DEFAULT NULL,
      `approved` bit(1) DEFAULT NULL,
      `approver_name` varchar(150) DEFAULT NULL,
      `approver_sub` varchar(120) DEFAULT NULL,
      `create_date` datetime DEFAULT NULL,
      `creator_name` varchar(150) DEFAULT NULL,
      `creator_sub` varchar(120) DEFAULT NULL,
      `modify_date` datetime DEFAULT NULL,
      `affiliations` varchar(500) NOT NULL,
      `html` bit(1) NOT NULL,
      `reject_reason` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    )
    

    如果表已存在,执行ALTER语句修改:

    ALTER TABLE message MODIFY COLUMN id bigint(20) NOT NULL AUTO_INCREMENT;
    
  2. 调整实体类主键注解
    适配H2的自增逻辑,使用GenerationType.IDENTITY策略,同时移除冗余的length配置(bigint类型无需设置长度):

    @Entity
    public class Message {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", nullable = false, unique = true)
        private long id;
    
        // 其他字段保持不变
    }
    
  3. 确认JPA配置
    确保spring.jpa.hibernate.ddl-auto设置为update(或测试环境用create),让Hibernate能同步实体与表结构的匹配性。

  4. 额外排查

    • 检查初始化数据库的脚本,确保id字段的自增配置已正确执行;
    • 排查代码中是否有手动给id赋值的逻辑,避免覆盖自动生成的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:04:51