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

Hibernate报错:H2数据库SQL执行成功却触发CommandAcceptanceException

问题分析

报错核心是NULL not allowed for column "ID",你看到数据已插入是因为Spring Boot初始化时SQL脚本执行顺序冲突:

  1. data.sql会在Hibernate自动建表前执行,你手动创建了带AUTO_INCREMENT的Book表;
  2. Hibernate默认的ddl-auto(通常为create或update)会在之后重新生成表结构,此时丢失了AUTO_INCREMENT配置;
  3. Hibernate执行import.sql的插入语句时,新生成的表没有自动生成ID的能力,导致插入失败;
  4. IDE中看到的数据来自data.sql的执行,和Hibernate后续执行的import.sql是两次独立操作。
解决方案

方案1:移除手动建表脚本(推荐)

直接删除data.sql,让Hibernate根据Book实体自动生成表结构:

  • 实体类的@GeneratedValue(strategy = GenerationType.AUTO)会自动适配H2的自增策略,生成带自增ID的表;
  • import.sql的插入语句无需修改,插入时数据库会自动生成ID。

方案2:保留手动建表,关闭Hibernate自动建表

在application.properties或application.yml中添加配置,禁止Hibernate自动修改表结构:

# application.properties
spring.jpa.hibernate.ddl-auto=none

这样Hibernate不会重新生成表,data.sql创建的带AUTO_INCREMENT的表会被保留,import.sql插入时ID会自动生成。

方案3:显式指定ID插入(不推荐)

如果必须保留现有脚本,修改import.sql显式指定ID值:

INSERT INTO Book (id, title, author, isbn, published, pages) VALUES
(1, 'Da Vinci Code', 'Dan Brown', '0001', '2000-01-01', 345);

这种方式违背ID自动生成的设计,不建议长期使用。

额外注意点
  • 检查application.properties中的spring.sql.init.mode配置,确保脚本执行模式符合预期(默认embedded,仅在H2等嵌入式数据库时执行);
  • 实体类中published字段定义为String但存储日期格式,建议改为LocalDate类型并添加@Column(columnDefinition = "DATE"),保持数据类型一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:55:53