对于 H2数据库架构映射到具有UUID 的实体, Hibernate ddl验证失败,异常:
根本原因:org.hibernate.tool.schema.spi.SchemaManagementException: 模式验证:列[testuuid]中遇到错误的列类型 在表格[
TEST
。dummy
];找到了[varbinary(Types#VARBINARY)],但是 期待[二进制(类型#BINARY)]
设定:
进一步的休眠设置:
H2 DDL最初是通过hibernate生成的,导致 UUID在H2数据库模式中由二进制' 表示。
禁用验证有效,但不是一种选择。
如何解决此问题?
答案 0 :(得分:2)
根本原因是 H2数据库中某些数据类型是同义词,但是hibernate currently does not handle this fact。
有another stackoverflow question targeting a similar issue,H2返回同义词类型而不是预期的类型。
A workaround is proposed in the related hibernate bugtracker ticket。只需实现一个自定义hibernate H2方言,它可能如下所示:
import java.sql.Types;
import org.hibernate.dialect.H2Dialect;
public class H2DialectCustom extends H2Dialect {
public H2DialectCustom() {
super();
registerColumnType(Types.BINARY, "varbinary");
}
}
和在hibernate / JPA设置中注册:
hibernate.dialect = H2DialectCustom
答案 1 :(得分:0)
我完全同意answer given by lOOtr。
另一种可能的解决方法是在JPA实体的UUID属性上显式指定列定义:
public class Entity {
@Column(columnDefinition = "varbinary not null")
private UUID uuid = UUID.randomUUID();
}