2013-10-22 105 views
0

我有一個名爲person的類,它映射到一個person表。一個人擁有一系列人物對象作爲屬性,代表他們的子女,以及代表他們父母的一系列人物對象。映射屬性類型相同的jpa關係

他們是一個鏈接表,通過他們的ID保存子/父母關係。以下是我有:

@ManyToMany(mappedBy = "id") 
@JoinTable(name = "PARENT_TO_CHILD_LINK_TABLE", joinColumns = @JoinColumn(name = "CHILD_ID"), inverseJoinColumns = @JoinColumn(name = "PARENT_ID")) 
private List<Person> parents; 

@ManyToMany(mappedBy = "id") 
@JoinTable(name = "PARENT_TO_CHILD_LINK_TABLE", joinColumns = @JoinColumn(name = "PARENT_ID"), inverseJoinColumns = @JoinColumn(name = "CHILD_ID")) 
private ArrayList<Person> children; 

我得到一個錯誤,指出註釋標誌着作爲映射不應有@JoinColumn@JoinTable註解。

這種關係看起來像一個很多的東西嗎?

+1

對於初學者,你想'@ ManyToMany'。你不能在兩個方向上都有@ @ OneToMany的關係! –

+0

所以當我把這個關係做成多對多的時候,這個映射就會消失嗎? – user1154644

+0

你需要它的一面。這只是一次,在[javadoc](http://docs.oracle.com/javaee/6/api/javax/persistence/ManyToMany.html)中非常清楚地闡述:「每個多對多關聯都有雙方,擁有方和非擁有方或反方,連接表在自己方面指定,如果關聯是雙向的,則任一方可以被指定爲擁有方,如果關係是雙向的,非擁有方必須使用ManyToMany批註的mappedBy元素來指定擁有方的關係字段或屬性。「 –

回答

2

要映射兩端存在集合的關係(如父子關係),您需要@ManyToMany。你不能在兩個方向都有@OneToMany的關係!

對於@ManyToMany,您只能在一側有@JoinTable,而您只需要在另一側有mappedBy。這只是一次,在javadoc中非常清楚地列出:

每個多對多關聯都有兩面,即擁有面和非擁有面或反面。連接表在主體側指定。如果該關聯是雙向的,則任一方都可以被指定爲擁有方。如果關係是雙向的,則非擁有方必須使用ManyToMany批註的mappedBy元素來指定擁有方的關係字段或屬性。

記住mappedBy總是是指財產的實體在關係的另一端。在同一實體的實例之間存在關係的情況下,它指的是在聲明它的同一個實體中的一個屬性。這可能看起來很奇怪,但這是正常規則的應用。

下面是一些代碼,會爲你工作:

@ManyToMany 
@JoinTable(name = "PARENT_TO_CHILD_LINK_TABLE", 
      joinColumns = @JoinColumn(name = "PARENT_ID"), 
      inverseJoinColumns = @JoinColumn(name = "CHILD_ID")) 
private List<Person> children; 

@ManyToMany(mappedBy = "children") 
private List<Person> parents; 

你實際上並不需要@JoinTable註釋;如果您不發表,JPA提供程序將爲表和列生成默認名稱。

+0

我有db系統,必須事先創建表,而不是讓JPA觸摸架構。這個用例的createtable.sql如何,你可以編輯顯示示例表結構和外鍵的答案嗎? – Whome

+0

啊,在這種情況下,你幾乎肯定需要一個'@ JoinTable'註解。如果你想看看有沒有註解的情況下產生的SQL,最好的做法是自己嘗試 - 更改你的代碼,在本地生成SQL,並將其與你需要的進行比較。 –