2013-01-01 82 views
26

美孚有:@ManyToMany(的mappedBy = 「富」)

@ManyToMany(mappedBy = "foos") 
private Set<Bar> bars 

和酒吧有:

@ManyToMany 
private Set<Foo> foos 

確實的mappedBy的位置屬性做出一個雙向的關係有什麼區別,其他比表是否被稱爲foo_bar或bar_foo;沒有mappedBy屬性,我得到兩個連接表,foo_bar和bar_foo。

+2

富和酒吧真的是一個糟糕的選擇這個詞。請考慮更多與現實世界中存在的關係有關的具體例子。 – haventchecked

回答

36

The documentation說:

如果關聯是雙向的,一側具有成爲所有者和一側具有成爲逆端部(即,其將在所述關聯更新的關係值時被忽略。表):

因此,具有mappedBy屬性的一面是反面。沒有mappedBy屬性的一側是所有者。

所有者方是Hibernate查看哪一方存在的一面。因此,例如,如果將Foo添加到Bar的一組foos中,Hibernate會將新行插入到連接表中。相反,如果您將一個條添加到Foo的條形集中,則不會在數據庫中修改任何內容。

+0

如果我想讓他們互相反映,如果添加了一個應該修改數據庫的酒吧,該怎麼辦? – NimChimpsky

+0

@NimChimpsky:在雙向關係中,當您更改Foo.bars時,您應該相應地更改Bar.foos,因此您不應該在修改內容時關心保存在數據庫中的內容。 「所有權」的概念只是關於數據庫的組織,而你的代碼應該完全不瞭解它。 –

+0

你有一個雙向的關聯:當你添加一個條到foo時,也添加foo到條。 –

1

mappedBy告訴Hibernate關係「擁有」鏈接的哪一側。在OneToManyOneToOne中,使用mappyedBy告訴Hibernate在另一個表中將會有一個外鍵用於存儲鏈接。

當涉及到ManyToMany時,有一個連接表,所以既不直接鏈接到另一個對象。但是,hibernate仍然需要知道哪些是「擁有」的一方,知道如何級聯操作。

+1

-1:mappedBy不指示哪個表具有外鍵,它與級聯無關。 –