Hibernate/JPA Manytone vs OneToMany

Hibernate/JPA Manytone vs OneToMany,hibernate,jakarta-ee,jpa,one-to-many,many-to-one,Hibernate,Jakarta Ee,Jpa,One To Many,Many To One,我目前正在阅读有关Hibernate的文档,我遇到了一点困难,想弄明白一些事情。它本质上与manytone和OneToMany关联之间的差异有关。虽然我在实际项目中使用过它们,但我不能完全理解它们之间的区别。据我所知,如果一个表/一个实体与另一个表/实体有manytone关联,那么该关联应该来自另一端OneToMany。那么,我们应该如何根据具体情况决定选择哪一个,以及它如何影响数据库/查询/结果?到处都有好的例子吗 附言:我认为这将是有益的,因为它与这个问题相关,如果有人能够解释协会所有者的观

我目前正在阅读有关Hibernate的文档,我遇到了一点困难,想弄明白一些事情。它本质上与
manytone
OneToMany
关联之间的差异有关。虽然我在实际项目中使用过它们,但我不能完全理解它们之间的区别。据我所知,如果一个表/一个实体与另一个表/实体有
manytone
关联,那么该关联应该来自另一端
OneToMany
。那么,我们应该如何根据具体情况决定选择哪一个,以及它如何影响数据库/查询/结果?到处都有好的例子吗


附言:我认为这将是有益的,因为它与这个问题相关,如果有人能够解释协会所有者的观点以及双向和单向协会之间的区别

假设您有订单和订单行。您可以选择在Order和OrderLine之间有一个单向的OneToMany(Order将有一个OrderLines集合)。或者,您可以选择在OrderLine和Order之间建立多工单关联(OrderLine将引用其订单)。或者您可以选择两者兼有,在这种情况下,关联将变成双向的一对一/多对一关联

您选择的解决方案主要取决于情况以及实体之间的耦合级别。例如,如果一个用户、一个公司、一个提供商都有许多地址,那么在每个地址和地址之间都有一个单向的地址,并且地址不知道其所有者,这是有意义的

假设您有一个用户和一条消息,其中一个用户可以有数千条消息,将其建模为一条消息到另一个用户之间的多个消息可能是有意义的,因为您几乎不会要求用户的所有消息。不过,这种关联可以是双向的,只是为了帮助查询,因为JPQL查询通过导航实体之间的关联来连接实体

在双向关联中,可能存在对象图不一致的情况。例如,订单A将有一组空的订单行,但某些订单行将引用A.JPA强制要求始终将关联的一侧作为所有者侧,另一侧作为反向侧。JPA忽略了反面。所有者方是决定存在何种关系的一方。在一对一双向关联中,所有者方必须是多方。因此,在前面的示例中,所有者端将是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
端作为所有者,在保存关联时只需要n+1个查询。其中n是关联数(多个边)


而将
@OneToMany
作为所有者,在插入具有关联(多个方面)的父实体(一侧)时,将导致2*N+1查询。其中一个查询用于插入关联,另一个查询用于更新关联实体中的外键。

我将通过一个示例来回答。假设您有一个订购或POS系统的设计。然后,每个订单都有订单详细信息(例如产品)。在这种情况下,我们有一个
@oneToMany
关系。这同样适用于销售和销售明细关系


如果我有一个用户表,并且每个用户都绑定到一个特定的商店,那么我们可以将多个用户绑定到同一个商店,因此
@manyToOne

虽然上述答案是准确的,但我将以不同的方式给出答案

@OneToMany
@ManyToOne
都有两个部分;左半部和右半部。例如:

  • @OneToMany
    =“一”是左边的部分,“多”是右边的部分
  • @ManyToOne
    =“Many”是左边的部分,“One”是右边的部分
使用这种理解的简单关联规则是,左侧部分表示定义关联的类

所以,如果您在引用Order类的OrderLine类中定义
@ManyToOne
,则表示与一个Order类关联的多个OrderLine

@ManyToOne
private Order parentOrder;