实体包含UUID时,对H2数据库的Hibernate数据库架构验证失败
对于H2数据库架构映射到具有UUID的实体,休眠DDL验证失败,并出现异常:
根本原因:org.hibernate.tool.schema.spi.SchemaManagementException: 架构验证:列[testuuid]中遇到错误的列类型 在表[
TEST
.dummy
]中找到[varinary(TYES#VARBINARY)],但是 预期为[BINARY(TYES#BINARY)]
设置:
- Hibernate 5.2.9最终版
- h2 1.4.194
进一步的休眠设置:
- hibernate.hbm2ddl.auto=验证
- 未显式设置数据库方言。
h2 DDL最初是使用Hibernate生成的,导致UUID在h2数据库架构中由""BINARY""表示。
禁用验证有效,但不是选项。
如何解决此问题?
解决方案
根本原因h2数据库中的某些数据类型是同义词,但hibernate currently does not handle this fact。
存在another stackoverflow question targeting a similar issue,其中H2返回同义词类型,而不是预期的类型。
Aworkaround is proposed in the related hibernate bugtracker ticket。只需实现一个自定义Hibernate H2方言,它可能如下所示:
package your.pckg.name;
import java.sql.Types;
import org.hibernate.dialect.H2Dialect;
public class H2DialectCustom extends H2Dialect {
public H2DialectCustom() {
super();
registerColumnType(Types.BINARY, "varbinary");
}
}
和在您的休眠/JPA设置中注册:
spring.jpa.Properties.hibernate.Dialect=you.pckg.name.H.DialectCustom
相关文章