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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:30:29