【问题标题】:Hibernate VARCHAR and NVARCHAR conversion errorHibernate VARCHAR 和 NVARCHAR 转换错误
【发布时间】:2018-08-20 11:21:31
【问题描述】:

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

Hibernate 失败并出现以下验证错误:

原因:org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: 在表 [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 数据.

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

【问题讨论】:

  • 损失看方向
  • 是的,从验证行为来看,方向似乎是错误的。

标签: java sql-server hibernate


【解决方案1】:
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 中放入参数 types.NVARCHAR

【讨论】:

  • 我不需要做任何修复。我只是在寻找解释我所描述的行为的原因。
猜你喜欢
  • 2021-08-31
  • 2013-04-07
  • 2011-12-11
  • 2023-03-24
  • 1970-01-01
  • 2020-04-07
  • 2016-03-18
  • 1970-01-01
  • 2011-07-11
相关资源
最近更新 更多