Hibernate VARCHAR和NVARCHAR转换错误

时间:2018-03-12 12:26:52

标签: java sql-server hibernate

Microsoft SQL Server,数据库中的列定义为NVARCHAR,但定义为@Column(name = "Column_Name", columnDefinition = "VARCHAR")的Java代码。

Hibernate失败,验证错误如下:

  

引起:org.hibernate.tool.schema.spi.SchemaManagementException:架构验证:表[Table_Name]中的列[Column_Name]遇到错误的列类型;找到了[nvarchar(Types#NVARCHAR)],但是期待[varchar(Types#VARCHAR)]       在org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateColumnType(SchemaValidatorImpl.java:105)〜[hibernate-core-5.0.12.Final.jar:5.0.12.Final]

这并不奇怪,但反向(database VARCHAR, code NVARCHAR)确实没有错误。

这听起来不合逻辑,我认为在数据库中使用NVARCHAR的代码中的VARCHAR定义可以工作,因为没有预期的Unicode数据丢失,并且数据库中带有VARCHAR的代码中的NVARCHAR应该是验证错误,因为这样可能会出现Unicode数据丢失。

是否存在这种奇怪的验证行为的原因?

2 个答案:

答案 0 :(得分:0)

我认为您应该通过指定org.hibernate.dialect.SQLServerDialect

的拨号来更改persistance配置文件中的配置。

答案 1 :(得分:0)

public class SQLServerUnicodeDialect extends org.hibernate.dialect.SQLServerDialect {
    public SQLServerUnicodeDialect() {
        super();
        registerColumnType(Types.CHAR, "nchar(1)");
        registerColumnType(Types.LONGVARCHAR, "nvarchar(max)" );
        registerColumnType(Types.VARCHAR, 4000, "nvarchar($l)");
        registerColumnType(Types.VARCHAR, "nvarchar(max)");
        registerColumnType(Types.CLOB, "nvarchar(max)" );

        registerColumnType(Types.NCHAR, "nchar(1)");
        registerColumnType(Types.LONGNVARCHAR, "nvarchar(max)");
        registerColumnType(Types.NVARCHAR, 4000, "nvarchar($l)");
        registerColumnType(Types.NVARCHAR, "nvarchar(max)");
        registerColumnType(Types.NCLOB, "nvarchar(max)");

        registerHibernateType(Types.NCHAR, StandardBasicTypes.CHARACTER.getName());
        registerHibernateType(Types.LONGNVARCHAR, StandardBasicTypes.TEXT.getName());
        registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
        registerHibernateType(Types.NCLOB, StandardBasicTypes.CLOB.getName() );
    }
}

试试这段代码,在registerColumnType中输入参数类型.NVARCHAR