@OneToOne/@ManyToOne/@ManyToMany 的非拥有实体方

San*_*eep 0 java persistence hibernate jpa associations

我试图理解 javax.persistence 注释@OneToOne@ManyToOne@ManyToMany。这些注释的描述提到了non-owning side. 具体来说:

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

[@ManyToOne]: 如果关系是双向的,则非拥有OneToMany 实体必须使用mappedBy 元素来指定作为关系所有者的实体的关系字段或属性。

[@ManyToMany]: 如果关系是双向的,非拥有方必须使用ManyToMany注解的mappedBy元素来指定拥有方的关系字段或属性。

我无法理解这个所有权方面。例如,我有以下关联:

一对一

多对一

在此输入图像描述

注:图片取自此处。


那么这些协会的非控股主体有哪些呢?

Ken*_*han 5

在两个对象之间的双向关系中,您必须选择哪一方来管理关系。从数据库的角度来看,管理关系意味着管理两个表之间链接的某些 FK 列的值。管理它的一方称为拥有方。否则,称为非拥有方。

回到你关于ProjectManager和 的例子Project。哪个对象是拥有方取决于您选择哪个对象来管理它们的关系。

如果您选择ProjectManager成为拥有方(因此Project是非拥有方),则仅ProjectManager#getProjects()使用 的值来确定此类 FK 列的值。(即本例中的projecttable 的project_manager_id列) 的值Project#getProjectManager()将被忽略,并且不会影响此 FK 列的值。

就 JPA 映射而言,它是:

@Entity
@Table(name="project_manager")
public class ProjectManager{

    @OneToMany
    private List<Project> projects = new ArrayList<>();

}

@Entity
@Table(name="project")
public class Project {

    @ManyToOne
    @JoinColumn(name = "project_manager_id")
    private ProjectManager projectManager;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您选择Project拥有方(因此ProjectManager是非拥有方),则仅Project#getProjectManager()使用 的值来确定该 FK 列的值,而 的值ProjectManager#getProjects()将被忽略。本例中的 JPA 映射将是:

@Entity
@Table(name="project_manager")
public class ProjectManager{

    @OneToMany(mappedBy="projectManager")
    private List<Project> projects = new ArrayList<>();

}

@Entity
@Table(name="project")
public class Project {

    @ManyToOne
    @JoinColumn(name = "project_manager_id")
    private ProjectManager projectManager;
}
Run Code Online (Sandbox Code Playgroud)

PS:我用属性访问来解释它,希望你能明白。