【问题标题】:How can Hibernate map the SQL data-type nvarchar(max)?Hibernate 如何映射 SQL 数据类型 nvarchar(max)?
【发布时间】:2010-11-09 02:56:54
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: sql-server-2005 hibernate varchar nvarchar


    【解决方案1】:

    可以通过以下方式修复 @Nationalized 来自 hibernate 的注释,用于标记字符数据类型,如国家化变体(NVARCHAR、NCHAR、NCLOB 等)。

    【讨论】:

      【解决方案2】:

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

          @Column(name="requestXml", columnDefinition = "ntext")
      private String request;
      

      【讨论】:

      • 这对我也有用。我在 DB 中使用 nvarchar(max) 并且 @Column(name="colName", columnDefinition = "nvarchar") 修复了它。
      【解决方案3】:

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

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

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

      【讨论】:

      • 为什么还要注册列类型 COLB?这个 $1 在 nvarchar($1) 中意味着什么?谢谢
      • 这是很久以前的事了,我不太记得了,但是 registerColumnType() 将 SQL 类型映射到 Hibernate 类型。 $l (L, not #1) 是表示 nvarchar 列长度的匹配模式。如果 nvarchar 列具有定义的长度,它将被映射到 VARCHAR 类型。如果 nvarchar 列有最大长度,它将被映射到 CLOB 类型。
      • 请注意,对于 sql server 2014,我必须在上面的代码中删除覆盖方法getTypeName !!
      【解决方案4】:

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

      【讨论】:

      • 1 美元。例如 registerColumnType(Types.NVARCHAR, 4000, "nvarchar($1)");
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2015-02-06
      • 2013-11-30
      • 2010-12-13
      相关资源
      最近更新 更多