如何正确映射@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
条件完成。
JPA没有提供验证方法,但Hibernate Validator会:
@NotNull
@Size(min=1)
public Set<Agreement> agreements = new HashSet<>();
然后你必须通过Validator手动测试它:
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
validator.validate(customer)
这在很大程度上取决于您想要强制执行的关系类型。如果协议可以独立于客户存在,那么这意味着协议中的customer_id必须可以为空。
如果协议不能独立存在,则假定客户ID不可为空,在这种情况下,如果没有创建客户,则无法在第一时间创建协议。这意味着您在客户和相应协议之间有更强的关联。
一旦我们确定我们的关系是强大的,我们就需要调查它的真实性以及谁将拥有谁。 Normaly是拥有这种关系的许多方面,并且更新正在通过许多方面发生。这意味着您的JoinColumn需要在MANY上,并且映射的需要在ONE侧。
有趣的情况是,当ONE侧实际拥有关系时所有权是反向的,在这种情况下,多方的外键不能为NULL,因为拥有一方无法知道多方侧键是什么。