我最近将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"/>
答案 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" );
...
}
}