2013-04-20 38 views
0

我已經閱讀了幾個關於使用Hibernate創建表之間的關聯的例子,我有點困惑。我想initilaly知道有多少表將在數據庫中創建沒有指定的另一邊任何註釋與代碼:Hibernate「mappedBy」使用

@Entity 
public class Flight implements Serializable { 
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name="COMP_ID") 
    public Company getCompany() { 
     return company; 
    } 
    ... 
} 

我懷疑兩個表飛行,公司和飛行包含外鍵COMPANY_ID。我對嗎?有什麼區別,如果我在另一邊添加「的mappedBy」爲:

@Entity 
public class Company { 
    @OneToMany(mappedBy="company") 
    public Set<Flight> getFlights() { 
     ... 
    } 
} 

多少表將被第二種方法產生的呢?我想第二種方法建立了雙向關聯。這兩種情況的實際區別是什麼? 「@ManyToMany」關聯中的「mappedBy」註釋又是怎麼回事?

+0

你在問兩種情況有什麼不同,但你只提出一種情況。另一種情況是什麼?此外,請閱讀此答案:http://stackoverflow.com/questions/16119531/hibernate-jpa-manytoone-vs-onetomany/16119715#16119715 – 2013-04-20 15:13:46

+0

第一種情況是公司實體中沒有任何註釋,第二種情況是註釋@OneToMany(mappedBy =「company」),就像你在第二個代碼片段中看到的那樣。 – arjacsoh 2013-04-20 15:21:28

回答

1

如果您未在航班屬性中添加任何註釋,則默認映射將適用,即@Basic。這意味着列表的全部內容將被序列化並存儲在名爲航班的列中。

這顯然不是你想要的。你想要的是使其成爲Flight中定義的ManyToOne關聯的反面。這就是@OneToMany(mappedBy = "company")所做的。

除此之外,你的假設是正確的。 ManyToOne默認使用實體表中的連接列進行映射。使用JoinColumn批註允許爲連接列(以及此連接列的其他屬性)指定一個不同於默認名稱的名稱。

+0

你的意思是「列表的全部內容將被序列化並存儲在名爲航班的列中」?數據庫中描述的是如何?爲了理解,我需要解釋數據庫中發生了什麼。我還想對「在飛行中定義的ManyToOne關聯的反面」做出同樣的解釋。 – arjacsoh 2013-04-20 15:35:19

+0

我的意思是Java序列化將用於將列表的全部內容轉換爲字節數組,並且該字節數組將存儲在公司表中名爲'flights'的列中。作爲ManyToOne的反面意味着這兩個字段實際上是相同的關聯:C1公司具有F1,F2和F3航班,因爲F1,F2和F3有C1作爲其公司。 Flight表中的單個連接列需要映射此雙向關聯。 – 2013-04-20 15:38:37

1

當您使用雙向關係時,通過使用mappedby可以避免它在兩個表中存儲關係的變化。從你的例子中,如果你刪除了mappedby,flight和company兩個表都會有關係字段。

相關問題