拥有Side与非拥有方在hibernate及其在元素映射的引用中的用法?

时间:2014-01-05 13:31:21

标签: java hibernate

我在研究hibernate时遇到了owning side and non-owning方面的术语。例如: - 这里是 关于在一对一映射中使用的mapby元素的使用声明

  

如果关系是双向的,非拥有方必须使用   mappedBy注释的OneToOne元素   指定拥有方的关系字段或属性。

但是我没有得到owning side and non-owning方面的内容?

3 个答案:

答案 0 :(得分:4)

拥有' side是其表将保存引用的实体。

如果您在EntityPersonEntityAddress之间存在一对一的关系,那么,如果EntityPerson是拥有方,那么它的表中会有类似

 ADDRESS_ID int NULL FOREIGN KEY REFERENCES Address (ID)

答案 1 :(得分:4)

双向关系拥有方的想法来自于关系数据库中没有像对象那样的双向关系。

在数据库中,我们只有外键,其中只有一个表可以拥有另一个外键。让我们举一个不能按预期工作的例子,看看为什么需要mappedBy:

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

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

这不仅会创建表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)
)

请注意文档上的主键。在这种情况下,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;

这意味着“关系的这一方的修改已经由关系IdDocument.person的另一方映射,因此无需在额外的表中单独跟踪它”。< / p>

这为我们提供了我们想要的映射,但有一个主要结果:

  • Hibernate不再跟踪对Person.idDocuments集合的修改,开发人员有责任修改IdDocument.person以修改关联。

答案 2 :(得分:1)

以下是我对大学有很多学生(一对多关系)的简单例子的理解

                       corresponds to       
College(Value Object) -----------------> College (Database Table)

                       corresponds to       
Student(Value Object) -----------------> Student (Database Table having column which is
                                                  foreign key to College table . 
                                                  So This is owning side and College  is
                                                  Non-owning side )

在对象表示方面,学生对象拥有方becoz它将参考指向大学专栏。所以学生在非拥有方拥有方和学院。

hibernate中所有者方和非拥有方在元素映射关系中的用法

非拥有方对象

@Entity
public class College {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int collegeId;
    @OneToMany(mappedBy="college") // here non-owning side using mapped by elment to specify
                                   // the relationship field of owning side
    private List<Student> students;
    }


Owning Side Object

@Entity
public class Student {
@ManyToOne
    private College college;
}

总之,拥有方是指对方的实体。就DB而言,它 转换为具有列的表实体,该列是其他表中列的外键,如 学院的案例有很多学生。

注意: - 拥有方表必须包含一个引用另一个表的id的连接列。这意味着拥有的side实体应该包含@joincolumn注释,否则它会将该名称视为主键列其他表的名称。见@OneToOne unidirectional and bidirectional