【发布时间】: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 值。"
标签: java sql-server hibernate