您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

映射不仅会创建表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_idID_DOCUMENTS。Hibernate正在数据库上创建 两个 单向(外键)关系,以实现 一个 双向对象关系。

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

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

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

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

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

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

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

其他 2022/1/1 18:14:15 有505人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶