Hibernate hibernate.hbm2ddl.auto = create / update / validate不适用于自定义方言吗?

时间:2011-10-09 07:13:56

标签: java hibernate nhibernate orm hibernate-mapping

我最近将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类型而不是自定义!

  

列a_column的db.dbo.table_name中的列类型错误。实测:   ntext,expected:text

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

P.S。 hibernate.hbm2ddl.auto =创建/更新也无效!

P.P.S。我的XML映射配置:

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

2 个答案:

答案 0 :(得分:0)

你看过this它看起来像是类似的东西。并且作者声称它正在发挥作用。并this

关于你的问题,我怀疑在验证你的课程时会被遗漏。你有没有正确地连接你的课程,并且在课程路径中是JAR吗?

此消息:

Found: ntext, expected: text

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

答案 1 :(得分:0)

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

在版本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" );

        ...
    }
}