【发布时间】: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