[英]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 列的值。 管理它的一方称为拥有方。 否则,称为非拥有方。
所以回到你关于ProjectManager
和Project
例子。 哪个对象是拥有方取决于您选择哪个对象来管理它们的关系。
如果您选择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.