Hibernate 在测试中为 H2 生成不正确的 DDL。 Springboot 3.2.2、Hibernate 6.4.1、H2 2.2.224

问题描述 投票:0回答:1

我将从 Spring 2.X (Java 8) 升级到 Spring 3.2.2 / Java 17 我的实体定义片段:

  @Column(columnDefinition = "CHAR(1 CHAR) DEFAULT 'N'")
  private Boolean checkFlag;

  @Column(length = 64)
  private String randomKey;

在生产中我们使用 Oracle,因此 columnDefinition 具有“CHAR(1 CHAR)”

在测试用例中,为H2生成的DDL如下:

checkFlag CHAR(1 CHAR) DEFAULT 'N'
,

问题是 H2 不支持 CHAR(1 CHAR),它需要 CHAR(1)

我尝试在 H2 URL 中设置各种模式:如 Oracle、Legacy。没有任何帮助。 这曾经在 Springboot 2.x 中工作

java spring-boot hibernate h2
1个回答
0
投票

如果在注释中指定了自定义列定义,JPA 按原样使用它,此定义的正确性由您负责。

这里最简单的解决方案是使用

CHAR
而不是非标准
CHAR(1 CHAR)
,因为无论如何 1 都是默认值。

H2也能够解析Oracle特定的长度,但仅限于Oracle兼容模式,在其他模式下仅允许标准长度规范。要将自定义设置传递给 H2,您需要使用

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE
或以任何其他方式禁用单元测试的 JDBC URL 自动配置,否则使用这些设置的自定义 JDBC URL 将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.