假设您有订单和订单行。您可以选择订单和订单行之间具有单向的OneToMany(订单将具有OrderLines的集合)。或者你可以选择在OrderLine和Order之间有一个ManyToOne关联(OrderLine会有一个对它的Order的引用)。或者您可以选择同时拥有这两个关联,在这种情况下,关联将成为双向OneToMany/ManyToOne关联。
您选择的解决方案主要取决于情况以及实体之间的耦合程度。例如,如果一个用户,一个公司,一个提供者都有很多地址,那么在他们每个人和地址之间都有一个单向的方向是有意义的,而且地址不知道他们的所有者。
假设您有一个用户和一条消息,其中用户可以拥有数千条消息,但将消息模型化为ManyToOne可能是有意义的,因为您很少会询问消息的所有消息无论如何用户。虽然JPQL查询可以通过导航关联进行实体间的连接,但该关联只能用于双向查询。
在双向关联中,您可能处于对象图形不一致的情况。例如,订单A将具有一组空的订单行,但某些订单行将具有对订单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;