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

标签 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时给出。目前我只能设置规则来创建 AgreementCustomer给出是因为 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/

相关文章:

java - 如果数据库(oracle)中没有记录,如何使用 spring jpa 与日期列结合显示零作为计数?

java - JPA 和 derby 空指针异常

java - Weblogic: java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z

java - JavaFx 中 3d 框的定位

java - Spring 数据jpa : Error creating bean with name 'entityManagerFactory'

java - 如何正确注释 hibernate 实体

java - 重新启动 karaf 需要更新包

java - 使用装饰器的 Thymeleaf 布局不起作用

java - 为什么 PrimitiveIterator<T,T_CONS> 存在?除了 PrimitiveIterator.OfInt、PrimitiveIterator.OfLong、PrimitiveIterator.OfDouble 之外还有什么?

java - 根据字段对 ArrayList 进行排序?