Maven运行Spring Boot JUnit5测试时data.sql日期字段未正确入库问题
问题根因排查
- Hibernate版本冲突导致的日期类型映射异常
Spring Boot 2.3.2.RELEASE 默认适配的Hibernate核心版本为5.4.18.Final,你在pom中手动指定了低版本5.3.5.Final,版本不兼容会导致JPA字段映射逻辑异常,尤其是LocalDateTime这类JSR310日期类型的映射。IDE运行时可能优先加载了项目依赖的高版本适配包,Maven执行测试时严格按照pom的依赖仲裁加载了5.3.5版本,因此出现运行结果差异。 - Maven测试执行时区和IDE时区不一致
data.sql中写的是字符串格式的日期,H2数据库解析日期时如果时区和预期不一致,可能出现日期解析失败被置为null的情况。IDE默认使用操作系统时区,Maven的surefire插件如果未指定时区,默认会使用UTC时区,可能导致日期解析异常。 - 实体类日期字段注解配置不正确
如果created_on字段对应的实体属性是LocalDateTime,未指定字段类型映射规则的话,低版本Hibernate可能无法正确匹配H2数据库的timestamp类型,导致插入后读取为null。
解决方案
- 移除pom中手动指定版本的Hibernate依赖,让Spring Boot父依赖自动管理兼容的Hibernate版本,删除如下配置:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.3.5.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>5.3.5.Final</version> </dependency>
如果确实需要使用jpamodelgen,只保留依赖节点、去掉<version>标签即可,父依赖会自动匹配兼容版本。
- 在pom中添加maven-surefire-plugin配置,指定测试运行的时区和编码,避免和IDE运行环境差异:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine>-Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8</argLine> </configuration> </plugin> </plugins> </build>
- 检查实体类日期字段的注解配置,确保类型映射正确,示例配置如下:
// 如果使用LocalDateTime类型 @Column(name = "created_on", columnDefinition = "timestamp") private LocalDateTime createdOn; // 如果使用Date类型 @Temporal(TemporalType.TIMESTAMP) @Column(name = "created_on") private Date createdOn;
- 修改data.sql中的日期写法,用H2数据库支持的timestamp函数包裹,避免字符串解析异常:
INSERT INTO orders (order_id, number, client_id, created_on) values (2, '0002', 1, TIMESTAMP '2021-11-21 16:12:20.414' );
- 若以上配置修改后问题仍存在,检查maven的资源过滤配置,确保
src/main/resources下的data.sql被正确拷贝到测试类路径下,没有被过滤规则排除。
内容的提问来源于stack exchange,提问作者Xavi
相关产品推荐
相关产品推荐

