SpringBoot集成H2数据库:脚本执行后无数据插入问题求助
解决Spring Boot 2.7.5 + @DataJpaTest下data.sql不执行的问题
核心问题分析
从日志和代码来看,Hibernate自动执行了建表操作,覆盖了data.sql创建的表结构,且INSERT语句未执行,最终导致测试数据为空。主要原因包括DDL执行顺序冲突、枚举类型不兼容、@DataJpaTest的默认数据源配置覆盖。
具体解决方案
1. 调整SQL脚本与Hibernate的执行顺序
在src/test/resources/application.properties中添加以下配置,确保data.sql在Hibernate建表后执行:
# 强制执行SQL初始化脚本 spring.sql.init.mode=always # 延迟数据源初始化,等待Hibernate完成表结构创建 spring.jpa.defer-datasource-initialization=true # 避免Hibernate重新建表覆盖数据,可选update或none spring.jpa.hibernate.ddl-auto=update
2. 修复枚举类型不兼容问题
日志显示Hibernate将枚举字段生成了varchar类型,但你的脚本中使用了H2的自定义ENUM类型,导致脚本执行失败。二选一调整:
方案A:修改SQL脚本适配Hibernate的varchar类型
删除脚本中的ENUM定义,直接用字符串类型:
drop table if exists encouragement; CREATE TABLE encouragement(ID INT PRIMARY KEY, CATEGORY VARCHAR(255), TOPIC VARCHAR(255), TONE VARCHAR(255), MESSAGE VARCHAR(512)); INSERT INTO encouragement VALUES(-1, 'Default', 'Default', 'Default', 'We walk by Faith, not by Sight'); INSERT INTO encouragement VALUES(0,'WhoIAmInChrist','AcceptedInChrist','Uplifting','John 1:12 I am God''s child.'); -- 其余INSERT语句
方案B:配置Hibernate生成ENUM类型字段
在实体类的枚举字段上添加注解,指定数据库列类型:
@Column(columnDefinition = "Category") @Enumerated(EnumType.STRING) private Category category; // 同理配置Topic、Tone字段
同时在配置文件中指定H2方言:
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
3. 禁用@DataJpaTest的默认数据源替换
@DataJpaTest默认会替换嵌入式数据库,可能忽略你的数据源URL配置,添加注解禁用该行为:
@ExtendWith(SpringExtension.class) @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) class EncouragementRepositoryTest { @Autowired EncouragementRepository repository; @Test public void find_all() { List<Encouragement> list = repository.findAll(); assertEquals(33,list.size()); } }
4. 验证脚本位置与命名
确保data.sql放在src/test/resources目录下,若使用自定义命名(如data-test.sql),需在配置文件中指定路径:
spring.sql.init.data-locations=classpath:data-test.sql
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

