【发布时间】:2018-05-28 10:05:00
【问题描述】:
我有一个包含两个字段的实体:
@ManyToOne(fetch = FetchType.LAZY, optional = true)
private Organization organization;
@Column(length = 15)
private String ref;
我想在organization 和ref 上添加唯一键,这个唯一键只有在organization 和ref 都不为空时才有效。
例如当我插入两条记录时:
organization = 1, ref = 'R1'
organization = 1, ref = 'R1'
这会产生违反约束的情况,到目前为止我对这种情况没有任何问题。
当我在哪里插入两条记录时:
organization = null, ref = null
organization = null, ref = null
这不会产生约束冲突,到目前为止我对这种情况也没有任何问题。
我遇到的问题是在这种情况下:
organization = 1, ref = null
organization = 1, ref = null
或者
organization = null, ref = 'R1'
organization = null, ref = 'R1'
这两种情况都会产生约束冲突,这是我不希望的,因为我只希望只有 organization 和 ref 都不为空时唯一约束才有效。
这就是我声明唯一约束的方式:
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = { "organization", "ref" })
})
我该如何解决这个问题。
PS:我使用的是 Oracle 12c。
编辑:
-
organization和ref两个字段都可以为空。 JPA -
我声明的@UniqueConstraint注解会生成SQL代码:
CREATE UNIQUE INDEX "USERNAME"."UK_TABLENAME_1" ON "USERNAME"."TABLENAME" ("organization", "ref")
【问题讨论】:
-
实体可以改吗?
-
@pirho 是的
-
为什么不在两个字段上同时添加
@NotNull和@Unique约束.. -
@AmolRaje 因为它们是可为空的字段