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



