我将从 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 中工作
如果在注释中指定了自定义列定义,JPA 按原样使用它,此定义的正确性由您负责。
这里最简单的解决方案是使用
CHAR
而不是非标准 CHAR(1 CHAR)
,因为无论如何 1 都是默认值。
H2也能够解析Oracle特定的长度,但仅限于Oracle兼容模式,在其他模式下仅允许标准长度规范。要将自定义设置传递给 H2,您需要使用
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE
或以任何其他方式禁用单元测试的 JDBC URL 自动配置,否则使用这些设置的自定义 JDBC URL 将被忽略。