2012-12-14 72 views
1

我對使用外鍵或一對一的一對一關聯有什麼好處有疑問在主鍵上的一個關聯,我已經閱讀了休眠的文檔可在:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html#assoc-unidirectional-121 有人可以告訴我的細節使用第一或第二個實施的好處嗎?休眠一對一(在外鍵上)與一對一(在主鍵上)

另一個問題,我是一個用戶和周長 (用戶---->周長)之間的一對一單向關係,我想使用基於外鍵的關聯。 我可以改變方向(用戶< ----周長),所以表格用戶保持完好? 我認爲這是不合理的(perimeter.getUser()!!!),但技術上可行嗎?

回答

3

除了由JB Nizet和感謝提到了另外一個人的優點跟我說,一到一個基於外鍵更靈活。讓我們考慮一下,如果應用程序的需求改變爲需要多個用戶的任何周邊,我使用外鍵(用戶< ---周長)一對一,如果我共享主鍵,我會有很多更重構要做。但爲我所用的外鍵,我要做的就是放鬆心情的唯一約束;)

3

我看到兩個優點

  • 具有選擇允許你映射現有模式,無論他們選擇了爲使用一個指向B中的ID的外鍵戰略
  • ,Hibernate知道有如果外鍵爲空,那麼沒有給定的A.它不知道何時使用主鍵。因此,如果關聯是可選的,則使用外鍵效率更高。

對於你的第二個問題,是的,當然這是可能的。這就是所謂的雙向OneToOne協會:

public class User { 
    // ... 

    @OneToOne 
    @JoinColumn 
    private Perimeter perimeter; 
} 

public class Perimeter { 
    // ... 

    @OneToOne(mappedBy = "perimeter") 
    private User user; 
} 
+0

首先感謝您的回覆,我明白了兩個優點。但我的第二個問題,我不希望有一個雙向的關係,只是用戶< - 周邊方向,因爲(我指的是Hibernate文檔,我不知道註釋相當不錯,在XML映射)雙向使我不得不添加一列到用戶表,但我不想觸摸用戶表 –

+0

雙向關聯不會更改模式的任何內容。如果您希望外圍表包含連接列而不是用戶表,那麼只需執行該操作即可。 –

1

一對一的關係使用主鍵關聯

在該關聯一個一對一的關係發生在一個實體與另一個實體中的一個事件有關。

這裏是鏈接,例如: primary key association

一對一的關係,使用外鍵關聯

在同樣的例子做了以下變化:

在StockDetail.java

private Integer stockDetailsId; 
    //with setter and getter 
    //remove stockId and it's setter and getter 

in stock.hbm.xml

<id name="stockId" type="java.lang.Integer"> 
       <column name="STOCK_ID" /> 
       <generator class="assigned" /> 
     </id> 

在StockDetail.hbm.xml

<id name="stockDetailsId" type="java.lang.Integer"> 
       <column name="STOCK_DETAILS_ID" /> 
       <generator class="assigned"/> 
    </id> 
    <many-to-one name="stock" 

    class="com.test.common.Stock" column="STOCK_ID" /> 
在hibernate.cfg

。xml

//this is optional property if you want to create database table's according to your hbm file's. 

    <property name="hibernate.hbm2ddl.auto">create</property>