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

发布于 2024-07-26 16:23:17 字数 569 浏览 9 评论 0原文

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

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

<元素类型=“文本”列=“值”/>

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

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

我应该在“type”属性中放入什么内容才能将列正确映射为 nvarchar(max)

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

I have a column in my SQL-2005 database that used to be a varchar(max), but it has been changed to an nvarchar(max).

Now I need to update my hibernate mapping file to reflect the change, and this is what it used to be:

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

When I try to run the application, the following error appears:

org.hibernate.HibernateException: Wrong column type in [Table] for column Value. Found: ntext, expected: text

What should I put in the 'type' attribute to correctly map the column as an nvarchar(max)?

I've tried setting the type to ntext, but hibernate didn't know what that was. I tried setting the type to string, but it treated string as a text type.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

东走西顾 2024-08-02 16:23:17

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

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

What worked for me is to put the actual column definition in a @Column annotation:

    @Column(name="requestXml", columnDefinition = "ntext")
private String request;
我爱人 2024-08-02 16:23:17

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

It can be fixed by
@Nationalized
annotation from hibernate, that marks a character data type like a nationalized variant (NVARCHAR, NCHAR, NCLOB, etc).

抹茶夏天i‖ 2024-08-02 16:23:17

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

Found the answer at Tremend Tech Blog. You have to write your own SQLServerDialect class, it looks something like this:

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";
        }
    }
}

This class maps Hibernate's types to SQL types, so the class will map the nvarchar(max) SQL Data Type to Hibernate's CLOB data type.

The getTypeName method is used to return "ntext" when Hibernate asks about the data type with code 2005 (which looks like it's the nvarchar(max) data type).

Finally, you need to change your hibernate persistence dialect to this new SQLServerDialect class, which allows hibernate to translate data types into SQL data types.

神爱温柔 2024-08-02 16:23:17

我觉得是这样的
registerColumnType(Types.VARCHAR, "nvarchar($l)"); // 我喜欢_l_ength,而不是1。

I think it is
registerColumnType(Types.VARCHAR, "nvarchar($l)"); // l like _l_ength, not 1.

萤火眠眠 2024-08-02 16:23:17

@Nationalizedlength = Integer.MAX_VALUE 结合使用应该可以解决 NVARCHAR(MAX) 的问题。

实体类应该有点像这样

    @Nationalized
    @Column(length = Integer.MAX_VALUE)
    private String nvarcharMax;

有关更多详细信息,请查看文档 此处

Using @Nationalized with length = Integer.MAX_VALUE should resolve the issue of NVARCHAR(MAX).

The entity class should somewhat like this

    @Nationalized
    @Column(length = Integer.MAX_VALUE)
    private String nvarcharMax;

For more details checkout the documentation here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文