2013-10-16 192 views
0

最近,我一直在學習Hibernate,而且我面臨一些困難。我的第一個問題如下:我對以下條款非常困惑。休眠註釋混淆

  1. 雙向映射
  2. 多對一

,因爲據我所知,在關係型數據庫,我們首先需要在父表中插入。然後我們可以在子表上插入,所以唯一可能的情況是一對多(先是父母然後是子女)。那麼,多對一的工作將如何進行呢?其次,關於Hibernate的這種雙向映射是什麼。具體來說,不同類型的連接註釋混淆了我很多。我在下面列出這些註釋。

[email protected](name = "Tbale_Name", joinColumns = { @JoinColumn(name = "Column_Name") }, 
    inverseJoinColumns = { @JoinColumn(name = "Another_ColumnName") }) 

[email protected](mappedBy="department")` this mappedby term 

[email protected] 

請幫我理解這些概念。

+0

http://fruzenshtein.com/bidirectional-many-to-one-association/ –

回答

1

我要說的第一件事就是不要用表格來思考,而要用對象來思考。

你試圖用註釋表達的是對象之間的關係,讓hibernate解決如何持久化數據。你顯然可以手動檢查SQL,但使用ORM的想法是相應地映射實體之間的關係,並讓ORM弄清楚生成SQL等的複雜性。

值得注意的是,父 - >子關係可以通過將mappedBy添加到關係的非擁有(子)側來使用@ManyToOne進行映射。然後Hibernate將決定首先插入數據庫的實體。使用TransactionManager運行將強制執行多表插入的完整性。 Hibernate也會訓練哪些實體需要被持久化,例如,如果你在一邊添加一個新對象到現有對象。

此外,值得理解的是,在某些情況下,它並不總是在父 - >子外鍵中生成主鍵的數據庫。它的代碼生成標識符和休眠的可能性將會持續它們。

雙向映射意味着對象實體相互之間有引用。即您可以從第一個實體中檢索第二個實體。雙向映射支持一對多 或多對多。即OneToMany = a在其中一個實體上設置。多對多=在兩個實體上設置。

JoinTable通知hibernate可以使用數據庫中的表來一起映射到其他表。有關更多信息,請參閱JPA "@JoinTable" annotation。 JoinColumn通知hibernate使用哪個列來建立兩個實體之間的連接。 Hibernate需要這些來構造SQL。

+0

你是對的,我必須考慮對象這就是爲什麼hibernate是一個orm,說我有兩個實體用戶和電子郵件,所以可以爲一個用戶提供多個電子郵件,爲我需要的特定用戶搜索電子郵件用戶信息首先,如果我不使用雙向映射,我將無法「從第一個實體檢索第二個實體實體 」? – NaN

+0

這是一個單向OneToMany關係,是'用戶'的所有者。如果您想獲取用戶的電子郵件,請獲取收藏。 I.e:user.getEmails() – mrod