JPA @OneToMany具有1-1 .. *关系

时间:2018-09-05 10:58:34

标签: java hibernate jpa orm one-to-many

如何正确地将@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}完成}条件。

2 个答案:

答案 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)