我的SQL-2005数据库中有一列曾经是 varchar(max) ,但已更改为 nvarchar(max) 。
现在,我需要更新我的hibernate映射文件以反映更改,这就是它过去的样子:
当我尝试运行该应用程序时,出现以下错误:
org.hibernate.HibernateException:[表]中列值的列类型错误。找到:ntext,预期:文本
我应该在’type’属性中添加什么以将列正确映射为 nvarchar(max) ?
我尝试将类型设置为 ntext ,但是hibernate不知道那是什么。我尝试将类型设置为 string ,但将 string 视为 文本 类型。
在Tremend Tech Blog上找到了答案。您必须编写自己的SQLServerDialect类,它看起来像这样:
public class SQLServerNativeDialect extends SQLServerDialect { public SQLServerNativeDialect() { super(); registerColumnType(Types.VARCHAR, "nvarchar($l)"); registerColumnType(Types.CLOB, "nvarchar(max)"); } public String getTypeName(int code, int length, int precision, int scale) throws HibernateException { if(code != 2005) { return super.getTypeName(code, length, precision, scale); } else { return "ntext"; } } }
此类将Hibernate的类型映射为SQL类型,因此该类会将 nvarchar(max) SQL数据类型映射 为Hibernate的 CLOB 数据类型。
该 getTypeName 方法被用来当Hibernate询问与2005码(看起来像它的数据类型为nvarchar(max)数据类型)的数据类型返回“NTEXT”。
最后,您需要将hibernate持久性方言更改为这个新的SQLServerDialect类,该类允许hibernate将数据类型转换为SQL数据类型。