当前位置: 首页 > 面试题库 >

Hibernate / JPA ManyToOne与OneToMany

阴凯歌
2023-03-14
问题内容

我目前正在阅读有关实体关联的Hibernate文档,但遇到一些困难却难以理解。它在本质上做的区别ManyToOneOneToMany联系。尽管我在实际项目中使用了它们,但是我无法完全理解它们之间的差异。据我了解,如果一个表/一个实体ManyToOne与另一个实体有关联,则该关联应来自另一侧OneToMany。那么,我们应该如何根据具体情况决定选择哪个呢?它又如何影响数据库/查询/结果?到处都有很好的例子吗?

PS:我认为这与问题相关,如果有人可以解释关联所有者的观点以及双向关联和单向关联之间的区别,那将是有帮助的。


问题答案:

假设您有一个订单和一个订单行。您可以选择在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中:

@ManyToOne
private Order parentOrder;


 类似资料:
  • 问题内容: 我看不到“多对一”关系与“一对一”关系的架构有什么区别: 与 有什么区别吗? 问题答案: 它们在架构上看起来完全相同,但是在Hibernate Layer上有所不同。 如果尝试这样的操作: 一切都会好起来的。但是,保存后,如果您尝试获取订单: 当然,在两种情况下,您的Address类应该看起来有所不同。

  • 问题内容: 我一直在解决这个问题,而 Hibernate SessionFactory 和 JPA EntityManagerFactory的 区别在于JPA是标准的。您可以使用它而不必担心底层的ORM。但它在后台调用了底层的sessionFactory(如果我错了,请纠正我) 但是,如果有人知道他将来必须坚持使用hibernate作为ORM,那么他应该从这两个 工厂中 选择什么,为什么? 其次,

  • 问题内容: 这些查询翻译器之间有什么区别(对于Hibernate用户而言,我的意思是不同)。互联网上的一些博客说基于ANTLR的翻译器更快。但是我认为,如果其中一个明显更好,那么Hibernate开发人员将删除另一个。那么..有什么区别?为什么我们都拥有它们?在什么情况下我应该选择第一还是第二?在什么情况下我不应该选择其中一位翻译? 问题答案: 这是 内部hibernate配置 ; 它将在升级到版

  • 问题内容: 我的项目使用spring3 jpa(hibernate),但是我在使用Hibernate Persistence类时遇到了问题……所以我无法正确创建我的entityManager,并且问题不断发生…… 我相信问题在我的pom.xml文件中!(如果这不是问题,那么也许在我的应用程序COntext.xml中?不这么认为,但他知道…) 这是pom.xml 现在错误输出: 您可以看到它是一个嵌

  • 问题内容: 我在父类和子类之间定义了双向的一对多关系。我正在寻找执行一个查询,以便我可以在bean中返回一个父对象及其子对象的子集。 我想要实现的输出是: 我想过滤父母的ID和孩子的年龄列。我尝试了多种查询组合以获取所需的输出。 以下内容很接近,但没有将子级分组到我定义的ParentChildWrapper bean中的集合中。我得到的结果是对象列表,每个孩子有1个实例与年龄过滤器匹配: 我还尝试

  • 我使用Hibernate 5.2.18在WebLogic 12c(12.2.1.4)上部署了一个应用程序。Weblogic 12c文档引用JPA 2.1兼容性,Hibernate 5.3需要JPA 2.2。我可以在启动类路径中预先添加JPA 2.2 API并使用Hibernate 5.3吗?还是应该暂时使用Hibernate 5.2?