开发者

How do I express this constraint with JPA?

开发者 https://www.devze.com 2023-03-30 09:49 出处:网络
I have a class that looks like this: public enum Scope { A, B, C... } @Entity public class User { ... Scope scope; // enum, see above

I have a class that looks like this:

public enum Scope {
  A, B, C...
}

@Entity
public class User {

    ...

    Scope scope; // enum, see above

    @ElementCollecton
    List<Long> numbers;

    ...
}

My problem is that I don't know how to express the 开发者_运维知识库following constraint with either JPA or directly in my Postgres database: There can only be one User with a scope x who has a number y.

In order to clarify what I mean, some pseudocode:

This is valid (Bobs 3 does not colide with Toms 3 since Bob has a different scope): Tom(scope=A,numbers=[1,2,3,4]), Carl(scope=A,number=[5,6,7]), Bob(scope=B,numbers=[3, 42, 100])

But this is invalid (Carls 4 violates the constraint since Tom has the same scope and also a 4 in his list): Tom(scope=A,numbers=[1,2,3,4]), Carl(scope=A,number=[4,5,6,7]), Bob(scope=B,numbers=[3, 42, 100])


One thing you can do is lie to JPA about the foreign key to the element collection and then put an ordinary unique constraint on the combination of scope + number in the collection table.

@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;

Obviously USER_SCOPE is totally unnecessary in the normalized model, but by telling JPA it's part of the key you can trick the provider into maintaining the column for you.

0

精彩评论

暂无评论...
验证码 换一张
取 消