JPA @OneToMany与1 - 1 .. *的关系

问题描述 投票:3回答:2

如何正确映射@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条件完成。

java hibernate jpa orm one-to-many
2个回答
1
投票

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)

3
投票

这在很大程度上取决于您想要强制执行的关系类型。如果协议可以独立于客户存在,那么这意味着协议中的customer_id必须可以为空。

如果协议不能独立存在,则假定客户ID不可为空,在这种情况下,如果没有创建客户,则无法在第一时间创建协议。这意味着您在客户和相应协议之间有更强的关联。

一旦我们确定我们的关系是强大的,我们就需要调查它的真实性以及谁将拥有谁。 Normaly是拥有这种关系的许多方面,并且更新正在通过许多方面发生。这意味着您的JoinColumn需要在MANY上,并且映射的需要在ONE侧。

有趣的情况是,当ONE侧实际拥有关系时所有权是反向的,在这种情况下,多方的外键不能为NULL,因为拥有一方无法知道多方侧键是什么。

© www.soinside.com 2019 - 2024. All rights reserved.