[英]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.