我目前正在读的Hibernate的有关文件实体关联 ,我来进行的跨一点困难弄清楚一些事情。 它在本质上做的区别ManyToOne
和OneToMany
关联。 虽然我已经在实际项目中使用他们,我不能完全领悟他们之间的differnce。 我的理解,如果一个表/实体具有ManyToOne
与另一个关联,那么,协会应该从对方OneToMany
。 那么,我们应该如何决定选择基于特定的情况下,其中的一个,它是如何影响数据库/查询/结果? 有无处不在一个很好的例子?
PS:我认为这将是有益的,由于其相关性的问题,如果有人能除了解释什么是关联的所有者和双向和单向协会之间的差异点。
假设你有一个订单和订单行的。 你可以选择有订单和订单行之间的单向一对多(订单将有OrderLines的集合)。 或者你可以选择订单行和订单之间的多对一关联(订单行就得了命令的引用)。 或者你可以选择同时拥有,在这种情况下,联想成为一个双向的一对多/多对一关联。
您选择主要的解决方案取决于具体情况,并在实体之间的耦合程度。 例如,如果一个用户,一个公司,一个供应商都有着很多的地址,它将使意义有充分的他们和地址之间的单向的,有地址不知道他们的主人。
假设你有一个用户和消息,用户可以在其中有数以千计的邮件,它可能是有意义的它模型只从信息给用户一个多对一,因为你很少对用户的所有邮件问反正。 该协会可以作出双向只以帮助查询虽然,因为JPQL查询,通过他们的协会导航实体之间的连接。
在双向关联,你可以在一个情况下物体的图形不一致。 例如,订单A将有一个空集OrderLines的,但有些OrderLines将不得不订单A. JPA一个基准对总是有关联是所述所有者侧的一侧,和另一侧为逆侧。 反侧由JPA忽略。 该业主方是决定什么关系所在的一侧。 在一对多的双向关联,业主方必须是很多副作用。 所以,在前面的例子中,所有者侧将订单行,和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;
而且,具有@ManytoOne
侧作为所有者将在保存associtions只需要n + 1个查询。 其中,n是协会(许多侧)的数量。
而具有@OneToMany
作为所有者,同时插入与关联(许多侧)父实体(一侧)将导致2次* N + 1次的查询。 在其中一个查询将是协会的插入和其他查询将在相关实体更新外键。