假设您有一个 Order 和一个 OrderLine。您可以选择在 Order 和 OrderLine 之间使用单向 OneToMany(Order 将具有 OrderLines 的集合)。或者,您可以选择在 OrderLine 和 Order 之间建立 ManyToOne 关联(OrderLine 将引用其 Order)。或者您可以选择两者都有,在这种情况下,关联变为双向 OneToMany/ManyToOne 关联。
您选择的解决方案主要取决于情况,以及实体之间的耦合程度。例如,如果用户、公司、提供商都有很多地址,那么在每个人与 Address 之间有一个单向的地址是有意义的,并且 Address 不知道他们的所有者。
假设您有一个 User 和一个 Message,其中一个用户可以有数千条消息,将其建模为从 Message 到 User 的 ManyToOne 是有意义的,因为无论如何您很少会询问用户的所有消息。不过,关联可以是双向的,只是为了帮助查询,因为 JPQL 查询通过浏览实体之间的关联来连接实体。
在双向关联中,您可能会遇到对象图不一致的情况。例如,Order A 将有一组空的 OrderLines,但某些 OrderLines 会引用 Order A。JPA 强制要求始终将关联的一侧作为所有者,而将另一侧作为反向。JPA 忽略反面。所有者方是决定存在什么关系的一方。在 OneToMany 双向关联中,所有者方必须是多方。因此,在前面的示例中,所有者方将是 OrderLine,并且 JPA 将保持行与订单 A 之间的关联,因为这些行具有对 A 的引用。
这样的关联将被映射如下:
为了 :
@OneToMany(mappedBy = "parentOrder") // mappedBy indicates that this side is the
// inverse side, and that the mapping is defined by the attribute parentOrder
// at the other side of the association.
private Set<OrderLine> lines;
在订单行中:
@ManyToOne
private Order parentOrder;