我有一个看起来像这样的课程:
public enum Scope {
A, B, C...
}
@Entity
public class User {
...
Scope scope; // enum, see above
@ElementCollecton
List<Long> numbers;
...
}
我的问题是我不知道如何用JPA或直接在我的Postgres数据库中表达以下约束: 只能有一个范围为x且具有数字y的用户。
为了澄清我的意思,有些伪代码:
这是有效的(因为Bob有不同的范围,Bobs 3与Toms 3不一致): 汤姆(范围= A,数字= [1,2,3,4]),卡尔(范围= A,数字= [5,6,7]),鲍勃(范围= B,数字= [3,42,100] ])
但这是无效的(Carls 4违反了约束,因为Tom有相同的范围,而且他的列表中有4个): 汤姆(范围= A,数字= [1,2,3,4]),卡尔(范围= A,数字= [4,5,6,7]),鲍勃(范围= B,数字= [3,42] ,100])
感谢您的帮助, 费边
答案 0 :(得分:1)
您可以做的一件事是向JPA说明元素集合的外键,然后在集合表中对范围+数字的组合放置一个普通的唯一约束。
@Column(name="SCOPE")
@Enumerated(EnumType.STRING)//or whatever
private Scope scope;
@ElementCollection
@CollectionTable(name= "NUMBERS" ,
joinColumns={ @JoinColumn(name = "USER_ID", referencedColumnName = "ID"),
@JoinColumn(name = "USER_SCOPE", referencedColumnName = "SCOPE") }),
@Column(name="NUMBER")
private List<Long> numbers;
显然,在规范化模型中,USER_SCOPE是完全没必要的,但通过告诉JPA它是密钥的一部分,你可以欺骗提供者为你维护列。