【问题标题】:Hibernate hibernate.hbm2ddl.auto=create/update/validate doesn't work for correctly for custom dialects?Hibernate hibernate.hbm2ddl.auto=create/update/validate 不适用于自定义方言?
【发布时间】:2011-10-09 07:13:55
【问题描述】:

我最近将 Hibernate 从 3.3.x 版本升级到 3.6.4。在 3.3.x 版本中,validateSchema (hibernate.hbm2ddl.auto=validate) 可以正常工作。

在 3.6.x 版本中,验证被破坏(也针对 3.6.4 和 3.6.7 进行了测试)。 该问题仅与字段类型文本有关。

我在方言中重新定义了 SQL 类型,例如

public class SQLServer2000UnicodeDialect extends SQLServerDialect {

public SQLServer2000UnicodeDialect(){
    super();

    // Use Unicode Characters
    ...
    registerColumnType( Types.CLOB, "ntext" );
    ...
}

}

但是在验证过程中,hibernate使用原始的SQL类型而不是自定义的!

db.dbo.table_name 中列 a_column 的列类型错误。成立: ntext,预期:文本

它看起来像一个错误,但不确定是不是。也许我在配置中遗漏了什么?

附: hibernate.hbm2ddl.auto=create/update 也不能正常工作!

附言我的 XML 映射配置:

<property name="propName" type="text" column="a_column"/>

【问题讨论】:

  • 在验证什么时,“hibernate 使用原始 SQL 类型而不是自定义”?
  • Configuration.validateSchema() 或 hibernate.hbm2ddl.auto=create/update/validate

标签: java hibernate orm hibernate-mapping


【解决方案1】:

你看过this吗,看起来很像。作者声称它正在工作。还有this

关于您的问题,我怀疑在验证您的课程时不知何故被遗漏了。您是否正确连接了您的类,并且类路径中是否有 JAR 等?

这条消息:

Found: ntext, expected: text

告诉我你在某处有一个ntext 类型的属性。我认为您应该做的是:继续在您的模式中使用休眠类型,并让休眠处理使用方言将类型转换为数据库特定类型。不要在 XML 映射文件中使用自定义类型。

【讨论】:

    【解决方案2】:

    这有点奇怪,但是在 3.4-3.6 版本中的某个地方休眠改变了“文本”映射的绑定(实际上是 hibernate have two types of mapping 用于长字符串:clob 和文本)。

    在 3.3 版中,两个映射(clob 和 text)都映射到 Types.CLOB

    在 3.6 版中,您必须为文本和 clob 提供单独的映射。如下所示修复我的方言解决了我的问题:

    public class SQLServer2000UnicodeDialect extends SQLServerDialect {
    
        public SQLServer2000UnicodeDialect(){
            super();
            ...
            registerColumnType( Types.CLOB, "ntext" );
            registerColumnType( Types.LONGVARCHAR, "ntext" );
    
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-12
      • 2018-07-06
      • 2016-09-08
      • 2011-01-27
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2016-04-21
      相关资源
      最近更新 更多