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

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

鲍钊
2023-03-14
问题内容

拥有方 到底是什么意思?一些映射示例( 一对多,一对一,多对一 )的解释是什么?

以下文本摘录自Java EE 6文档中 @OneToOne 的描述。您可以在其中看到概念 拥有的一面

定义与另一个具有一对一多重性的实体的单值关联。通常不必显式指定关联的目标实体,因为通常可以从被引用对象的类型中推断出该目标实体。如果关系是双向的,
则非拥有方
必须使用OneToOne批注中的mappingBy元素来指定拥有方的关系字段或属性。


问题答案:

为什么拥有一方的概念是必要的:

双向关系拥有一方的想法来自这样一个事实,即在关系html" target="_blank">数据库中不存在像对象一样的双向关系。在数据库中,我们只有单向关系-外键。

“拥有方”这个名字的原因是什么?

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

拥有权概念解决的问题是什么?

以两个 声明拥有方的映射实体为例:

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

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

从OO的角度来看,此映射不是定义一个双向关系,而是定义 两个 单独的单向关系。

映射不仅会创建表PERSONSID_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)
)

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

另一方面,如果调用idDocument.setPerson(person),则会在table上更改外键person_id
ID_DOCUMENTS。Hibernate正在数据库上创建 两个 单向(外键)关系,以实现 一个 双向对象关系。

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

很多时候,我们要的是上表只是一个外键ID_DOCUMENTSPERSONS和额外的关联表。

为了解决这个问题,我们需要将Hibernate配置为停止跟踪对Relation的修改Person.idDocuments。Hibernate应该只跟踪关系的
另一IdDocument.person,为此,我们添加了 mappingBy

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

这是什么意思mappingBy?

这意味着类似:“该关系这一侧的修改已 被关系IdDocument.person的另一侧 映射 ,因此无需在额外的表中单独跟踪它。”

是否有任何GOTCHA,后果?

使用 的mappedBy
,如果我们只调用person.getDocuments().add(document),外键ID_DOCUMENTS
被链接到新的文件,因为这不是关系的所属/跟踪的一面!

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

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



 类似资料:
  • 问题内容: 拥有方到底是什么意思?一些映射示例(一对多,一对一,多对一)的解释是什么? 以下文本摘录自Java EE 6文档中@OneToOne的描述。您可以在其中看到概念拥有方面。 定义与另一个具有一对一多重性的实体的单值关联。通常不必显式指定关联的目标实体,因为通常可以从被引用对象的类型中推断出该目标实体。如果关系是双向的,则非拥有方必须使用OneToOne批注中的mappingBy元素来指定

  • 1.【强制】 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。 说明: 1) 增加查询分析器解析成本。 2) 增减字段容易与 resultMap 配置不一致。 2.【强制】 POJO 类的布尔属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中进行 字段与属性之间的映射。 说明:参见定义 POJO 类以及数据库字段定义规定,在<resultMap

  • 在一对多关系中,通常使用@ManyToOne注释的字段是所有者-另一方具有“mappedBy”属性。但是,如果我跳过“mappedBy”并用@JoinColumn(同一列)注释两侧,我可以更新两侧-更改将传播到db。 我没有两个单向关系而不是一个双向关系-只有一个连接列。 没有选择一方作为关系所有者会遇到什么问题? 我的实体看起来类似于以下内容: 它似乎对性能没有任何影响(至少看起来不错),下面是

  • 我不熟悉Spring数据jpa,并试图理解@OneToOne映射。假设我有一个员工实体和一个公司实体,如果我想映射这两个实体,那么我可以在员工实体上使用一对一映射,这意味着一个员工只能属于一个公司。这种理解是错误的吗?如果一名员工属于一家公司(比如XYZ),那么该公司(XYZ)不能映射到其他员工? 我读过一些帖子,但没有完全理解。

  • 蜻蜓映射是一款动态域名解析软件,外网通过蜻蜓映射域名随时随地访问到内网搭建服务。 蜻蜓映射是内网穿透,端口映射的软件服务商。支持HTTP、HTTPS、TCP、UDP、等多种协议。 无需设置路由器端口映射即可外网访问内网服务器。适用于远程桌面、 远程服务器、远程办公、游戏联机、微信开发调试等内网穿透场景。蜻蜓映射端口映射官网 如何使用蜻蜓映射 注册账号 下载客户端并登录 添加映射

  • 我读过一个映射是“关系在Java中是指源对象有一个引用另一个目标对象的属性,并且(如果)目标对象与源对象有反向关系,它也将是一个一个关系。”来源:http://en.wikibooks.org/wiki/java_persistence/OneToOne 基于以上,我假设一个表可以引用基数为(零)1的另一个表,而这个表可以反向引用基数为(零)1的第一个表。 所以,我创建了这个简单的实体(Cust可