栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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

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的角度来看,此映射不是定义一个双向关系,而是定义 两个 单独的单向关系。

映射不仅会创建表

PERSONS
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
ID_documentS
唯一的。在这种情况下,Hibernate会独立跟踪关系的两侧:如果将文档添加到关系中
Person.iddocuments
,它将在关联表中插入一条记录
PERSON_ID_documentS

另一方面,如果调用

iddocument.setPerson(person)
,则会在table上更改外键person_id
ID_documentS
。Hibernate正在数据库上创建 两个 单向(外键)关系,以实现 一个 双向对象关系。

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

很多时候,我们要的是上表只是一个外键

ID_documentS
PERSONS
和额外的关联表。

为了解决这个问题,我们需要将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时 ,开发人员有责任知道什么是拥有方,并更新关系的正确方,以触发数据库中新关系的持久性。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/470882.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号