为什么拥有一方的概念是必要的:
双向关系拥有一方的想法来自这样一个事实,即在关系数据库中不存在像对象一样的双向关系。在数据库中,我们只有单向关系-外键。
“拥有方”这个名字的原因是什么?
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时 ,开发人员有责任知道什么是拥有方,并更新关系的正确方,以触发数据库中新关系的持久性。



