2010-01-19 90 views
17

可能重複:
Hibernate unidirectional one to many association - why is a join table better?爲什麼建議避免外鍵上的單向一對多關聯?

在Hibernate的在線文檔,根據第7.2.3 1對許多人來說,它提到,認爲:

一個單向對外關鍵字 是一種不尋常的情況, 並且不推薦。您應該使用 而不是使用此關聯的此類 的連接表。

我想知道爲什麼?我唯一想到的是,它可能會在級聯刪除時產生問題。例如,Person指的是外鍵上的一對多關係的地址,並且該地址將拒絕在該人面前被刪除。

任何人都可以解釋推薦背後的理由嗎?

這裏是鏈接到參考文檔內容:7.2.3. One-to-many

我複製粘貼在這裏的實際內容:

單向的一對多關聯的外鍵是一個 異常情況,並不建議。

<class name="Person"> 
    <id name="id" column="personId"> 
     <generator class="native"/> 
    </id> 
    <set name="addresses"> 
     <key column="personId" 
      not-null="true"/> 
     <one-to-many class="Address"/> 
    </set> 
</class> 

<class name="Address"> 
    <id name="id" column="addressId"> 
     <generator class="native"/> 
    </id> 
</class> 

create table Person (personId bigint not null primary key) 
create table Address (addressId bigint not null primary key, personId bigint not null) 

你應該使用一個連接表對於這種關聯的。基於外鍵

+0

請參閱http://stackoverflow.com/questions/1307203/hibernate-unidirectional-one-to-many-association-why-is-a-join-table-better – 2012-10-23 11:24:13

回答

14

單向一個一對多的關聯 是一個不尋常的情況下, ,不推薦。

有兩個方面是:

  • 單向
  • 一個一對多

thread@CalmStorm的答案被刪除的鏈接地址僅第二這些東西,但讓我們先從它開始。

該線程建議使用連接表替換一對多關係,否則一對多方法會使用不屬於該實體的列填充多個邊表,是否僅用於「鏈接」 porpuses(原文如此)'。這種策略可能會導致Hibernate層中的乾淨模型,但不幸的是,它會導致數據庫破損。

由於SQL只能斷言子記錄具有父級;沒有辦法執行父母必須有孩子的規則。因此,沒有辦法堅持一張表在連接表中有條目,結果是可能有孤兒子記錄,這是外鍵預防的事情。

我還有其他幾個反對意見,但其次最重要的是不恰當。交叉表是爲了表示多對多的關係。使用它們來表示一對多關係是令人困惑的,並且需要太多額外的數據庫對象來滿足我的需要。

所以,到第二個方面:單向一對多關聯。這些問題是Hibernate在默認情況下處理它們的獨特方式。如果我們在同一個事務中插入一個父項和一個子項,Hibernate將插入子項記錄,然後插入父項,然後使用父項的關鍵字更新子項。這需要可延遲的外鍵約束(yuck!),並且可能延遲非空約束(double yuck)。

這有幾個解決方法。一種是使用雙向一對多關聯。根據in the document you cite這是最常見的方法。另一種方法是調整子對象的映射,但它有其自身的影響。

+0

謝謝,這說明了很多! – Shaw 2010-01-20 04:28:30

+7

我不確定您是否推薦單向一對多或者不是 – 2011-02-01 13:28:13

+1

我同意@Pangea。 APC提出了一些很好的觀點,其中一些我同意,但不清楚APC認爲什麼是一個好的解決方案。 – 2012-06-29 14:33:51

相關問題