如何通过自定义脚本自动正确填充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'
可行解决方案
- 修复配置文件语法错误
原配置存在多行配置连写、注释与配置混写的问题,导致配置解析异常,修正后的配置如下:
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
- 统一表名与字段名大小写
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注解的表名与脚本一致,无需添加反引号。
- 避免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
相关产品推荐
相关产品推荐

