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数据丢失。
是否存在这种奇怪的验证行为的原因?
答案 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