如何正确映射@OneToMany
在 @One
上创建实体的关系@OneToMany
的一侧关系,需要至少有一个来自 @Many
的实体侧面但实体在 @Many
侧面还需要 @One
上的实体方存在?简单来说,这就是我的噩梦场景:
这就是我想要的:
[ENTITY A] 1 <-----> (1..*)[ENTITY B]
目前我有这个:
[ENTITY A] 1 <-----> (0..*)[ENTITY B]
这样很容易完成。
@OneToMany(cascade=CascadeType.ALL, mappedBy="customer")
public Set<Agreement> agreements = new HashSet<>();
和
@ManyToOne
@JoinColumn(name = "CUSTOMER_ID", nullable=false)
private Customer customer;
所以问题是我的CUSTOMER
表没有对应于 AGREEMENT
的列因此我无法强制执行创建 Customer
的规则仅当Agreement
时给出。目前我只能设置规则来创建 Agreement
当Customer
给出是因为 AGREEMENT
表具有对应于 CUSTOMER
的列tabel,这可以通过 nullable=false
轻松完成情况。
最佳答案
这在很大程度上取决于您想要加强哪种类型的关系。如果协议(protocol)可以独立于客户而存在,则这意味着协议(protocol)中的 customer_id 必须可为空。
如果协议(protocol)不能独立存在,则假定客户 ID 不可为空,在这种情况下,在未创建客户的情况下无法首先创建协议(protocol)。这意味着客户与相应协议(protocol)之间的关联性更强。
一旦我们定义了一段牢固的关系,我们就需要调查它到底有多牢固以及谁将拥有谁。通常,关系由多方拥有,并且更新是通过多方进行的。这意味着您的 JoinColumn 需要位于 MANY 一侧,而映射 by 需要位于 ONE 一侧。
当所有权是反向的时,当一方实际拥有该关系时,这是一个有趣的情况,在这种情况下,多方的外键不能为 NULL,因为拥有一方无法知道多方的内容关键是。
关于java - JPA @OneToMany 具有 1 - 1..* 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52183474/