gpt4 book ai didi

java - 我如何用 JPA 表达这个约束?

转载 作者:行者123 更新时间:2023-11-29 12:22:42 25 4
gpt4 key购买 nike

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

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

@Entity
public class User {

...

Scope scope; // enum, see above

@ElementCollecton
List<Long> numbers;

...
}

我的问题是我不知道如何使用 JPA 或直接在我的 Postgres 数据库中表达以下约束:只能有一个范围为 x 且编号为 y 的用户。

为了阐明我的意思,一些伪代码:

这是有效的(Bobs 3 不会与 Toms 3 冲突,因为 Bob 的作用域不同):汤姆(范围=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])

最佳答案

您可以做的一件事是对 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 它是键的一部分,您可以欺骗提供者为您维护该列。

关于java - 我如何用 JPA 表达这个约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7150349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com