如何正确地将@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
表格相对应的列,这很容易由{{1}完成}条件。
答案 0 :(得分:3)
这在很大程度上取决于您要实施哪种类型的关系。如果协议可以独立于客户而存在,则意味着协议中的customer_id必须为空。
如果协议不能独立存在,则假定客户ID不可为空,在这种情况下,如果没有创建客户,则不能首先创建协议。这意味着您与客户和相应协议之间的联系更加紧密。
一旦我们定义了一种牢固的关系,就需要研究这种关系到底有多牢固以及谁将拥有谁。通常,拥有关系的是多方,并且更新是通过多方进行的。这意味着您的JoinColumn必须在MANY上,并且by的映射必须在ONE一侧。
一个有趣的情况是当ONE一方实际拥有该关系时所有权是相反的,在这种情况下,多方的外键不能为NULL,因为拥有ONE方无法知道多方关键是。
答案 1 :(得分:1)
JPA没有提供验证方法,但是Hibernate Validator可以:
@NotNull
@Size(min=1)
public Set<Agreement> agreements = new HashSet<>();
然后,您必须通过验证程序手动对其进行测试:
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
validator.validate(customer)