一尘不染

Hibernate如何映射SQL数据类型nvarchar(max)?

hibernate

我的SQL-2005数据库中有一列曾经是 varchar(max) ,但已更改为 nvarchar(max)

现在,我需要更新我的hibernate映射文件以反映更改,这就是它过去的样子:

当我尝试运行该应用程序时,出现以下错误:

org.hibernate.HibernateException:[表]中列值的列类型错误。找到:ntext,预期:文本

我应该在’type’属性中添加什么以将列正确映射为 nvarchar(max)

我尝试将类型设置为 ntext ,但是hibernate不知道那是什么。我尝试将类型设置为 string ,但将 string 视为 文本 类型。


阅读 494

收藏
2020-06-20

共1个答案

一尘不染

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数据类型。

2020-06-20