2017-06-26 185 views
0

考慮一個像項目和任務的一對多關聯,其中一個項目可以有多個任務。如果這是使用引用項目表主鍵的任務表中的外鍵子句建模的,那麼我們將@JoinColumn註釋放在擁有的一面,即任務表中,因爲許多方面始終是擁有方。 但是,如果通過使用第三個表project_task映射它,@JoinTable註釋正在反面使用,即在項目實體上。但是@JoinTable應該總是在自己的一面。爲什麼@JoinTable註釋總是與@OneToMany註釋一起出現

方法用一個外鍵:

@Entity 
public class Project { 

    @OneToMany(mappedBy = "project") 
    private Collection<Task> tasks; 

} 

@Entity 
public class Task { 

    @ManyToOne 
    @JoinColumn(name="PROJECT_ID") 
    private Project project; 

} 

方法有兩個與第三個表和@JoinTable註釋:

@Entity 
public class Project { 

    @JoinTable(name = "MY_JT", 
    joinColumns = @JoinColumn(
      name = "PROJECT_ID", 
    ), 
    inverseJoinColumns = @JoinColumn(
      name = "TASK_ID" 
    ) 
    @OneToMany 
    private List<Task> tasks; 

} 
@Entity 
    public class Task { 

     private Project project; 

} 

爲什麼使用@JoinTable當擁有方向項目實體?

回答

0

嘗試將擁有方理解爲知道該關聯的另一端的實體。

我是擁有實體如果我能夠達到相關的實體,所以我有信息這讓我達到相關的實體。

最常用的情況是將外鍵放在關聯的許多方面。 所以,如果你有項目和任務之間的關係,並且我們說1個項目可以有很多任務。 一個project_id列將被添加到Task表中,該表將成爲關係的擁有者一方,因爲它擁有允許它從Car到達Project Entity的信息(Project Fk)。

當您在OneToMany關聯上使用@Jointable時,您正在設計一個單向關聯,因此汽車實體不再有像雙向關聯中那樣到達關聯用戶實體的信息。 該信息現在由用戶實體中的連接表保存,以便用戶實體成爲關係的主體。

所以要回答你的問題,你的問題轉移到了Projet,因爲現在你不能再從一個任務到達一個項目,並且與項目關聯的任務的唯一方法就是使用Project實體持有的連接表。所以現在它是通過它的joinTable的項目實體,它保存信息來檢索與項目相關的任務。 希望它很清楚。

0

「轉移」是什麼意思?關聯的擁有方是該關聯的只有一側,或者其關聯註釋沒有mappedBy參數的一方。

在第二個示例中,Project是擁有方,因爲該關聯是單向的(Task中沒有該關聯的映射)。

關聯的擁有方是管理關聯的那方(即對該方的更改將被記錄)。曾Task定義是這樣的:

@Entity 
public class Task { 
    @ManyToOne(mappedBy="tasks") 
    private Project project; 
} 

Project仍然是擁有方(意思是:將被記錄到Project.tasks變化,而到Task.project變化將被忽略)。這是一個不尋常的,但有效的映射(通常在雙向一對多關聯中聲明多方擁有方通常更有意義,但也可以採取相反的做法)。