【问题标题】:Hibernate database schema validation fails for H2 database when entity contains UUID当实体包含 UUID 时,H2 数据库的休眠数据库模式验证失败
【发布时间】:2017-08-22 22:59:43
【问题描述】:

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

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

设置:

  • 休眠 5.2.9.Final
  • H2 1.4.194

更多休眠设置:

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

H2 DDL 最初是使用 hibernate 生成的,导致 UUID 在 H2 数据库架构中由“二进制”表示

禁用验证有效,但不是一个选项。

我该如何解决这个问题?

【问题讨论】:

    标签: java hibernate h2


    【解决方案1】:

    根本原因H2数据库中有些数据类型是同义词,但是hibernate currently does not handle this fact

    another stackoverflow question targeting a similar issue 与 H2 返回同义词类型而不是预期的类型。

    workaround is proposed in the related hibernate bugtracker ticket。只需实现一个自定义休眠 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 = your.pckg.name.H2DialectCustom

    【讨论】:

      【解决方案2】:

      我完全同意answer given by AntiTiming

      另一种可能的解决方法是在 JPA 实体的 UUID 属性上明确指定列定义:

      public class Entity {
      
          @Column(columnDefinition = "varbinary not null")
          private UUID uuid = UUID.randomUUID();
      
      }
      

      【讨论】:

      • 你拯救了我的一天!这在非春季环境中对我有用! (R3 Corda)
      • 升级到 Corda 4.8 时对我也有帮助。谢谢
      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2017-05-27
      相关资源
      最近更新 更多