14

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

现在我需要更新我的休眠映射文件以反映更改,这就是它曾经的样子:

<element type="text" column="Value"/>

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

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

我应该在“类型”属性中添加什么才能正确地将列映射为nvarchar(max)

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

4

4 回答 4

20

对我有用的是将实际的列定义放在 @Column 注释中:

    @Column(name="requestXml", columnDefinition = "ntext")
private String request;
于 2012-06-27T12:31:43.407 回答
9

它可以通过 @Nationalized hibernate 的注释来修复,该注释将字符数据类型标记为国家化变体(NVARCHAR、NCHAR、NCLOB 等)。

于 2017-04-26T16:03:36.503 回答
7

在Tremend 技术博客上找到了答案。您必须编写自己的 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数据类型。

当Hibernate 询问代码为 2005 的数据类型(看起来像是 nvarchar(max) 数据类型)时, getTypeName方法用于返回“ntext”。

最后,您需要将您的 hibernate 持久性方言更改为这个新的 SQLServerDialect 类,它允许 hibernate 将数据类型转换为 SQL 数据类型。

于 2009-07-08T20:20:02.790 回答
0

我认为它是 registerColumnType(Types.VARCHAR, "nvarchar($l)"); // 我喜欢 _l_ength,而不是 1。

于 2009-08-20T20:36:40.763 回答