ORM 映射中的“拥有方”是什么?

2024-04-12

具体是做什么的拥有方意思是?一些映射示例的解释是什么(一对多、一对一、多对一)?

以下文字摘录自描述@一对一在 Java EE 6 文档中。你可以看到这个概念拥有方 in it.

定义一个单值关联 另一个具有一对一关系的实体 多重性。通常情况下不会 需要指定相关的 明确的目标实体,因为它可以 通常可以从类型推断 被引用的对象。如果 关系是双向的,这 非拥有方必须使用mappedBy OneToOne 注释的元素 指定关系字段或 属于拥有方的财产。


为什么需要拥有方的概念:

双向关系拥有方的想法来自这样一个事实:在关系数据库中不存在像对象那样的双向关系。在数据库中我们只有单向关系——外键。

“拥有方”这个名称的由来是什么?

Hibernate 跟踪的关系的拥有方是关系的一方owns数据库中的外键。

拥有方的概念解决了什么问题?

举一个映射两个实体的例子without声明拥有方:

@Entity
@Table(name="PERSONS")
public class Person {
    @OneToMany
    private List<IdDocument>  idDocuments;
}

@Entity
@Table(name="ID_DOCUMENTS")
public class IdDocument {
    @ManyToOne
    private Person person;
}

从面向对象的角度来看,此映射定义的不是一种双向关系,而是two分离的单向关系。

映射不仅会创建表PERSONS and ID_DOCUMENTS,但也会创建第三个关联表PERSONS_ID_DOCUMENTS:

CREATE TABLE PERSONS_ID_DOCUMENTS
(
  persons_id bigint NOT NULL,
  id_documents_id bigint NOT NULL,
  CONSTRAINT fk_persons FOREIGN KEY (persons_id) REFERENCES persons (id),
  CONSTRAINT fk_docs FOREIGN KEY (id_documents_id) REFERENCES id_documents (id),
  CONSTRAINT pk UNIQUE (id_documents_id)
)

注意主键pk on ID_DOCUMENTS仅有的。在这种情况下,Hibernate 独立跟踪关系的两侧:如果将文档添加到关系Person.idDocuments,它在关联表中插入一条记录PERSON_ID_DOCUMENTS.

另一方面,如果我们调用idDocument.setPerson(person),我们更改表上的外键 person_idID_DOCUMENTS。 Hibernate 正在创建two数据库上的单向(外键)关系,以实现one双向对象关系。

拥有方的概念如何解决这个问题:

很多时候我们想要的只是表上的外键ID_DOCUMENTSPERSONS而不是额外的关联表。

为了解决这个问题,我们需要配置 Hibernate 以停止跟踪关系上的修改Person.idDocuments。 Hibernate 应该只跟踪other关系的一方IdDocument.person,为此我们添加mappedBy:

@OneToMany(mappedBy="person")
private List<IdDocument>  idDocuments;

映射的意思是什么?

这意味着:“关系这一边的修改已经映射者关系 IdDocument.person 的另一端,所以不需要 在额外的表中单独跟踪它。”

有什么陷阱和后果吗?

Using mappedBy,如果我们只调用person.getDocuments().add(document),外键在ID_DOCUMENTS will NOT链接到新文档,因为这不是关系的拥有/跟踪方!

要将文档链接到新人,您需要显式调用document.setPerson(person),因为那是拥有方的关系。

使用时mappedBy,开发人员有责任知道什么是拥有方,并更新关系的正确方,以便触发数据库中新关系的持久化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORM 映射中的“拥有方”是什么? 的相关文章

随机推荐

  • 如何使用 Mongoid 更新 Rails 中嵌套的 Mongo 文档属性?

    如果这个问题缺乏细节 请提前道歉 我会看评论并添加我能添加的内容 我有一个具有以下内容的模型 class Product include Mongoid Document include Mongoid Timestamps field d
  • 运行模拟器时出错:架构 i386 的重复符号

    我添加了 ShareKit 框架来尝试 这是在模拟器中运行它的错误 duplicate symbol LFHRReadStreamClientCallBack in Xcode DerivedData build Objects norma
  • eclipse 无法删除某些断点

    双击eclipse左侧的蓝色条设置断点 再次双击可删除断点 这对我来说非常有用 但如果我使用 git 来签出不同的分支 通常断点的蓝点会变得 混乱 或其他什么 我无法再双击来取消它们 我被迫进入调试视角 并在 断点 视图中找到断点 然后右键
  • C# 正则表达式匹配带点的单词

    敏捷的棕色狐狸跳过了 懒狗 是英语 全字母表 字母表 也就是一个短语 包含所有字母 字母表 它已被用来测试 打字机字母表 和电脑 键盘和其他应用程序 涉及到所有的字母 英文字母表 我需要得到 字母表 正则表达式中的单词 上面的文字中有3个实
  • Telerik 报告不起作用

    处理报表 ReportStandart 时发生错误 无法建立与数据库的连接 请验证您的连接字符串是否有效 如果您使用应用程序配置文件中的命名连接字符串 请确保名称正确并且连接字符串设置存在于应用程序的配置文件中 内部异常 转到报表项目所在的
  • 从外部 php 系统登录 Odoo

    我有一个要求 我需要从外部 php 系统重定向到 Odoo 并且用户也应该登录 我想到了以下两种方法来完成此任务 来自 php 端的 url 重定向 它调用特定的控制器 并沿着 url 传递凭据 由于显而易见的原因 这不是一个安全的选项 从
  • 程序中出现了“\303”和“\215”——为什么? [复制]

    这个问题在这里已经有答案了 而不是我发现的程序中的杂散 302 here https stackoverflow com questions 5167656 error stray 302 in program 我收到错误消息 algo c
  • 获取公共 Google 文档文件的下载链接

    正在阅读谷歌文档 API http code google com apis documents docs 3 0 developers guide protocol html DownloadingFiles我发现这个 正在下载 无法以其
  • 为什么我们需要结构体? (C#)

    要使用结构体 我们需要实例化该结构体并像使用类一样使用它 那我们为什么不首先创建一个类呢 结构是一种值类型 因此如果您创建副本 它实际上会物理复制数据 而对于类 它只会复制对数据的引用
  • Firebase 无法在 Android Studio 模拟器上运行

    我当时正在做一个学习项目 一切都工作正常 但我将操作系统更改为 win11 同时擦除了所有以前的数据 现在 在使用任何类型的登录后 Firebase 都会停留在 正在加载 状态 实时数据库数据也不会显示 等待大约 5 10 个小时后 身份验
  • 从 Intellij 在远程主机上部署/运行 jvm 应用程序

    是否可以在 intellij 的远程服务器上部署 运行 出于测试目的 独立的 Java 应用程序 我并不是要连接到已经运行的 JVM 而是要从 intellij 在远程主机上启动一个新的 JVM 就像它在我的本地计算机上运行一样 目前没有内
  • python:如何重建需要编译的依赖项

    由于存在大量依赖项 我的 python 应用程序的虚拟环境的安装在部署过程中花费了太多时间 为了最大限度地减少时间 我想将驻留在 git 虚拟环境中的依赖项包括在内 以便它们在部署时就已经存在 主要问题是 由于机器之间的架构差异 需要重建与
  • 角度/形式整数验证器

    如何验证我的数字输入字段仅接受整数而不接受任何类型的小数 逗号 点 Code Component import FormGroup FormBuilder Validators from angular forms this savingD
  • NPM 如何更新/升级传递依赖?

    我在我的节点服务器中使用express v4 16 4 它已引入 cookie signature v1 0 6 我想将 cookie signature 升级到 v1 1 0 因为它有我需要的修复 有什么方法可以做到这一点 我认为我不应该
  • Charles Proxy:映射到 GET 请求而不是 OPTIONS [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有办法根据特定请求在 Charles 中进行本地映射 我的 API 发出 OPTIONS 请求 然后发出 GET 请求 当我在 Cha
  • 如何在React中添加事件监听器?

    我正在与用户和代理创建一个聊天应用程序 当代理在他单独的 Rainbow UI 上回复时 我试图检索消息 问题是这只能通过事件监听器来完成 如文档中所示 有人可以帮助我吗 我可以在哪里以及如何帮助我document addEventList
  • 发布 Google Maps API v2 Android 的流式传输方向

    因此 我的应用程序的一部分构建了一个导航方向字符串 然后尝试解析 JSON 并在地图上绘制折线路线 我首先使用位置变量或区域设置常量构建字符串 我最终得到类似的东西 https maps googleapis com maps api di
  • Python 中是否有类似于 Java 的 Thread.yield() 的东西?这还有道理吗?

    我想告诉我的 Python 线程让出 从而避免不必要地占用 CPU 在 Java 中 您可以使用Thread yield 功能 我认为Python中没有类似的东西 所以我一直在使用time sleep t where t 0 00001 F
  • setTimeout 和 jQuery:未捕获 RangeError:超出最大调用堆栈大小 [重复]

    这个问题在这里已经有答案了 我试图在页面加载时调用我的类 并每隔 X 秒重新加载结果 但是在 setTimeout 教程之后 jquery 似乎给我抛出了一个错误 考虑到它是无语法的 我不明白 未捕获的范围错误 超出最大调用堆栈大小 var
  • ORM 映射中的“拥有方”是什么?

    具体是做什么的拥有方意思是 一些映射示例的解释是什么 一对多 一对一 多对一 以下文字摘录自描述 一对一在 Java EE 6 文档中 你可以看到这个概念拥有方 in it 定义一个单值关联 另一个具有一对一关系的实体 多重性 通常情况下不