簡體   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