如何用JPA表达这个约束?

时间:2011-08-22 16:13:00

标签: java postgresql jpa jpa-2.0

我有一个看起来像这样的课程:

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])

感谢您的帮助, 费边

1 个答案:

答案 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它是密钥的一部分,你可以欺骗提供者为你维护列。