当实体包含UUID

时间:2017-03-29 12:40:16

标签: java hibernate h2

对于 H2数据库架构映射到具有UUID 的实体, Hibernate ddl验证失败异常

  

根本原因:org.hibernate.tool.schema.spi.SchemaManagementException:   模式验证:列[testuuid]中遇到错误的列类型   在表格[TESTdummy];找到了[varbinary(Types#VARBINARY)],但是   期待[二进制(类型#BINARY)]

设定:

  • Hibernate 5.2.9.Final
  • H2 1.4.194

进一步的休眠设置:

  • hibernate.hbm2ddl.auto =验证
  • 未明确设置数据库方言。

H2 DDL最初是通过hibernate生成的,导致 UUID在H2数据库模式中由二进制' 表示。

禁用验证有效,但不是一种选择。

如何解决此问题?

2 个答案:

答案 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();

}