如何使用 Hibernate 注释创建允许 NULL 值的唯一约束?
Posted
技术标签:
【中文标题】如何使用 Hibernate 注释创建允许 NULL 值的唯一约束?【英文标题】:How can I create a Unique Constraint that allows NULL values with Hibernate annotations? 【发布时间】:2014-04-05 00:02:32 【问题描述】:我正在使用:Spring 4、Hibernate 4、SQL Server 2008
我从这个问题回复How do I create a unique constraint that also allows nulls? 知道如何使用 SQL Server 2008 进行操作
但是由于我在创建表的过程中没有生成任何手动 SQL 代码,是否可以通过我的实体类中的 Hibernate 注释在我的约束中生成“where 子句”?
我的 DDL 是使用 java 实体定义从头开始创建的:
@Entity
@Table(name="Neighborhood",
uniqueConstraints = @UniqueConstraint(columnNames = "codecnbv","zipcode"))
@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
public class Neighborhood implements Serializable
private String id;
private String codecnbv;
private String zipcode;
@Id
@Column(name="id", nullable=false, unique=true, length=2)
public String getId()
return this.id;
@Column(name="codecnbv", nullable=true, length=12) //explicitly nullable
public String getCodecnbv()
return codecnbv;
@Column(name="zipcode", nullable=true, length=5) //explicitly nullable
public String getZipcode()
return zipcode;
但是,一旦我添加数据并尝试在列 codecnbv 和/或 zipcode 中输入第二条为 NULL 的记录,我就会收到一个异常,指出我违反了唯一约束。
我的要求是我必须允许多个空值,当值不为空时,我应该有唯一的值,即
对于邮政编码列
-
56000 --好的
NULL --ok
34089 --好的
NULL --ok
34089 --不允许
34567 --好的
【问题讨论】:
请检查实体表上真正放置了什么样的约束。运行show create table your_table_name
一个唯一的约束将允许你一个空值。如果它允许您使用多个空值,那么它就不会是唯一的 :)
@M.Ali 我认为 NULL 不会违反唯一约束。让 A 通过 FK 与 B 相关,并且关系是 ONE - ONE,但不是强制性的。您的假设将阻止创建此类约束
@M.Ali 旧论点。 null
表示没有价值,所以对它应用unique
的限制是没有意义的。总的来说,我喜欢 SQL Server,但这是一个重大错误。
@M.Ali 如果它被认为是一个未知值,那么它应该更不被认为是一个唯一值。 mysql 更正确地处理了这个问题:“一个 UNIQUE 索引创建一个约束,使得索引中的所有值都必须是不同的。如果您尝试添加一个具有与现有行匹配的键值的新行,则会发生错误。对于所有引擎,一个UNIQUE 索引允许包含 NULL 的列有多个 NULL 值。"
【参考方案1】:
这不是 Hibernate 的问题,而是 SQL Server 的问题,它认为 NULL
是一个值,并且不允许第二个 NULL
值。邪恶,我知道。
一些链接:
How do I create a unique constraint that also allows nulls?
http://sqlmag.com/database-development/multiple-nulls-unique-constraints
【讨论】:
另一个链接:***.com/questions/1796414/… SJuan76 我在 SQL Sever 中看到了关于 NULL 值的观点。我想我将不得不以编程方式管理这个业务逻辑。谢谢。以上是关于如何使用 Hibernate 注释创建允许 NULL 值的唯一约束?的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate 不会在 h2 中为使用 @Entity 注释的类创建专用表