如何使用 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 注释的类创建专用表

此位置不允许使用注释 @Index

如何使用 Hibernate 注释标记外键约束?

如何将继承策略与 JPA 注释和 Hibernate 混合使用?

如何使用 Hibernate 加载 HSQLDB 脚本

java - 如何在hibernate java中为给定的xml使用注释