我owning side and non-owning在学习 hibernate 时遇到了 ie side这两个术语。例如:- 这是关于mappedby 元素在一对一映射中的用法的声明
如果关系是双向的,非拥有方必须使用注解的
mappedBy元素OneToOne来指定拥有方的关系字段或属性。
但我没有得到真正的owning side and non-owning一面是什么?
双向关系拥有方的想法来自这样一个事实,即在关系数据库中没有像对象那样的双向关系。
在数据库中,我们只有外键,其中只有一个表可以有另一个表的外键。让我们举一个无法按预期工作的示例,看看为什么需要 mappingBy :
@Entity
@Table(name="PERSONS")
public class Person {
@OneToMany
private List<IdDocument> idDocuments;
}
@Entity
@Table(name="IDDOCUMENT")
public class IdDocument {
@ManyToOne
private Person person;
}
Run Code Online (Sandbox Code Playgroud)
这不仅会创建表 PERSONS 和 IDDOCUMENTS,还会创建第三个表 PERSONS_IDDOCUMENTS:
CREATE TABLE persons_iddocument
(
persons_id bigint NOT NULL,
iddocuments_id bigint NOT NULL,
CONSTRAINT fk_persons FOREIGN KEY (persons_id) REFERENCES persons (id),
CONSTRAINT fk_docs FOREIGN KEY (iddocuments_id) REFERENCES iddocument (id),
CONSTRAINT pk UNIQUE (iddocuments_id)
)
Run Code Online (Sandbox Code Playgroud)
请注意仅文档上的主键。在这种情况下,Hibernate 独立跟踪关系的双方:如果将文档添加到关系 Person.idDocuments,它会在 PERSON_IDDOCUMENTS 中插入一条记录。
如果我们更改 IdDocument 的 Person,它会更改表 IDDOCUMENTS 上的外键 person_id。
Hibernate 是在数据库上创建两个单向(外键)关系,来实现一个双向对象关系,因为数据库不支持双向关系。
但是我们想要的是对象关系仅由表 IDDOCUMENTS 上的外键映射到 PERSON:一个文档只属于一个人。
不需要额外的表,这会迫使我们在同一个数据库事务中修改 Person.idDocuments 和 IdDocument.person 以保持关系一致。
为了解决这个问题,我们需要配置 Hibernate 来停止跟踪关系 Person.idDocuments 上的修改。Hibernate 应该只跟踪关系 IdDocument.person 的另一端,为此我们添加了mappedBy:
@OneToMany(mappedBy="person")
private List<IdDocument> idDocuments;
Run Code Online (Sandbox Code Playgroud)
这意味着“关系这一侧的修改已经被关系 IdDocument.person 的另一侧映射,因此无需在额外的表中单独跟踪它”。
这为我们提供了我们想要的映射,但有一个主要后果:
| 归档时间: |
|
| 查看次数: |
2811 次 |
| 最近记录: |