繁体   English   中英

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

[英]Non-owning entity side of @OneToOne/@ManyToOne/@ManyToMany

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

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

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

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

我在理解所有权方面有困难。 例如,我有以下关联:

一对一

多对一

在此处输入图片说明

注:图片取自此处。


那么这些协会的非拥有实体方面是哪些?

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

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

如果您选择ProjectManager作为拥有方(因此Project是非拥有方),则只有ProjectManager#getProjects()的值将用于确定此类 FK 列的值。 (即在这种情况下project表的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;
}

另一方面,如果您选择Project到拥有方(因此ProjectManager是非拥有方),则只有Project#getProjectManager()的值将用于确定此 FK 列的值,而ProjectManager#getProjects()的值将用于确定此 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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM