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

如何通过自定义脚本自动正确填充H2数据库?

问题:Spring启动时自动填充H2数据库失败

当前Spring数据源配置

spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=truelogging.level.org.hibernate.SQL=DEBUG
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=create# Show or not log for each sql query
spring.jpa.show-sql = truespring.jpa.generate-ddl=true
spring.jpa.defer-datasource-initialization=true

自定义脚本

schema.sql

create table items
(
item_id int not null auto_increment,
value varchar(50) not null,
primary key (item_id)
);

data.sql

INSERT INTO ITEMS(ITEM_ID, value) VALUES(1, 'EXAMPLE');

问题现象

项目启动时自动填充H2数据库报错,但手动执行脚本无问题。已尝试两种方案仍报错:

  • 修改实体类@Table(name = "ITEMS")为@Table(name = "ITEMS")
  • 修改data.sql中的值为'EXAMPLE'

可行解决方案

  1. 修复配置文件语法错误
    原配置存在多行配置连写、注释与配置混写的问题,导致配置解析异常,修正后的配置如下:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
logging.level.org.hibernate.SQL=DEBUG
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=create
# Show or not log for each sql query
spring.jpa.show-sql = true
spring.jpa.generate-ddl=true
spring.jpa.defer-datasource-initialization=true
  1. 统一表名与字段名大小写
    H2数据库默认对标识符大小写敏感,schema.sql创建的是小写items表,而data.sql中插入的是大写ITEMS表,导致表不存在错误。任选以下一种方式调整:
  • 修改data.sql使用小写表名:
    INSERT INTO items(item_id, value) VALUES(1, 'EXAMPLE');
    
  • 修改schema.sql创建大写表名:
    create table ITEMS
    (
    ITEM_ID int not null auto_increment,
    VALUE varchar(50) not null,
    primary key (ITEM_ID)
    );
    

同时确保实体类@Table注解的表名与脚本一致,无需添加反引号。

  1. 避免DDL执行冲突
    配置spring.jpa.hibernate.ddl-auto=create时,Hibernate会自动根据实体类生成表,与自定义schema.sql的表创建操作冲突,可二选一:
  • 将spring.jpa.hibernate.ddl-auto设为none,完全依赖schema.sql创建表
  • 移除schema.sql,让Hibernate生成表,仅保留data.sql填充数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:50:21