当前位置: 首页 > 知识库问答 >
问题:

hibernate/JPA many toone vs one tomany

冯翔
2023-03-14

我目前正在阅读Hibernate关于实体关联的文档,我遇到了一些问题。它本质上与ManyToOneOneToMany关联之间的区别有关。尽管我在实际项目中使用过它们,但我无法完全理解它们之间的区别。根据我的理解,如果一个表/实体与另一个表或实体有ManyToOne关联,那么该关联应该来自另一方OneToMany。那么,我们应该如何根据具体案例决定选择哪一个,以及它对数据库/查询/结果有何影响?到处都有好榜样吗?

PS:我认为这将很有帮助,因为它与这个问题有关,如果有人可以解释协会所有者的意义是什么以及双向和单向协会之间的区别。

共有3个答案

齐意致
2023-03-14

此外,将@ManytoOne作为所有者只需要 n 个查询,同时保存关联。其中 n 是关联数(多边)。

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

羊城
2023-03-14

虽然以上答案是准确的,但我将以不同的方式呈现答案。

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

    < li> @OneToMany = '一'是左半部分,而'多'是右半部分 < Li > < code > @ Many toone = ' Many '是左边部分,而' One '是右边部分

使用这种理解的简单关联规则是,左部分代表您定义关联的类。

因此,如果您在OrderLine类中定义引用订单类的< code>@ManyToOne,这意味着许多订单行与一个订单类相关联。

庄星汉
2023-03-14

假设您有一个Order和一个OrderLine。您可以选择在Order和OrderLine之间设置单向OneToMany(Order将具有OrderLine集合)。或者您可以选择在OrderLine和Order之间建立ManyToOne关联(OrderLine将引用其Order)。或者您可以选择两者都有,在这种情况下,关联变成双向OneToMany/ManyToOne关联。

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

假设您有一个User和一个Message,其中一个用户可以有数千条消息,那么只将其建模为一个从消息到用户的ManyToOne是有意义的,因为您无论如何都不会要求用户的所有消息。但是,由于JPQL查询通过导航实体之间的关联而在实体之间连接,因此可以将关联设置为双向的,以帮助查询。

在双向关联中,您可能会遇到对象图不一致的情况。例如,Order A将有一组空的OrderLines,但是一些OrderLines将有一个对Order 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
private Order parentOrder;
 类似资料:
  • 在本章中,我们将讨论BeanEditForm和Grid component与Hibernate的集成。 Hibernate通过hibernate模块集成到tapestry中。 要启用hibernate模块,请在pom.xml文件中添加tapestry-hibernate依赖项和可选的hsqldb 。 现在,通过放置在资源文件夹根目录的hibernate.cfg.xml文件配置hibernate。

  • Hibernate是一种高性能的对象/关系持久性和查询服务,它在开源GNU宽通用公共许可证(LGPL)下获得许可,可以免费下载。 在这一章当中。 我们将学习如何实现Struts 2与Hibernate的集成。 如果您不熟悉Hibernate,那么您可以查看我们的Hibernate教程 。 数据库设置 在本教程中,我将使用“struts2_tutorial”MySQL数据库。 我使用用户名“root

  • iBATIS和Hibernate之间存在重大差异。 鉴于其特定领域,这两种解决方案都运行良好。 建议使用iBATIS - 您想创建自己的SQL,并且愿意维护它们。 您的环境由关系数据模型驱动。 您必须处理现有的和复杂的模式。 如果环境由对象模型驱动并且需要自动生成SQL,请使用Hibernate。 iBATIS和Hibernate之间的区别 Hibernate和iBATIS都是业界可用的开源对象关

  • Hibernate是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有。 它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始

  • 问题内容: 在tomcat 7中部署应用程序时,我从此pom.xml运行mvn tomcat7:run时遇到此错误。在我的依赖项中,我想问题可能是由于相依软件包的混合版本引起的。 这是../../pom.xml: 问题答案: 此类是在4.xx版本中添加的,您将不会在Hibernate 3中找到它 可能是您的Maven依赖关系树中有2个版本。 你需要: 跑 检查您有多少个版本以及哪些其他3rd oa

  • 问题内容: 我有两个实体A和B。 UUID是从外部给出的;ID可以视为版本。 现在,我想在B中引用A,以便将uuid存储在B中,并自动选择具有相应uuid和最高ID的A。 我试过的是: 这将在B中创建一个包含A的ID的列,并在我尝试持久化对象时引发异常。我也尝试过@JoinColumnsOrFormulas,但是没有运气。 有人可以给我一个提示(在Hibernate 3.5 btw中)吗? 谢谢!

  • 问题内容: 而不是将数据库操作分散在四个(osgi)包中,所有操作都在这里稍有不同。我想创建一个负责所有持久性问题的(简单)OSGi捆绑包。我觉得这并不像听起来那么简单,因为“每捆都有唯一的类加载器”。因此,如果有人知道这种问题的解决方案,我将非常感激。 问题答案: (如果您正在使用hibernate注释) 在通知Hibernate捆绑包有关注释类的信息后,保存所有Entities类加载器。 然后

  • 配置我的Hibernate(JBoss Tools 4.3)配置失败后,它不会在Hibernate透视图的列表中显示名为“Hibernate”的Hibernate配置。当我尝试添加具有相同名称的新Hibernate配置时,eclipse说具有该名称的配置已经存在,但我看不到它。 所以我关闭了我的Eclipse Luna,当我试图再次打开它时,Eclipse会询问我的工作区路径,我单击OK,然后工作