2011-04-12 55 views
2

我使用多對嘗試這個簡單的單向一到一個關係一個一對一的映射使用唯一約束無法正常運行

人---->地址

獨特的約束映射。

這是我的映射看起來像在Person.hbm.xml:

<class name="Person" table="PERSON"> 
<many-to-one name="address" column="ADDRESS_ID" cascade="all" not-null="true" unique="true"/> 

我想這應該允許每個人只有一個唯一的地址 - 沒有兩個人可以共用一個地址。

因此,下面的代碼應該失敗。但是在這段代碼中,Hibernate允許Johns保持同一地址。

Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction transaction = session.beginTransaction(); 
    Address address = new Address("Bond Street", "London", 121212); 
    Person person1 = new Person("John Doe", address); 
    Person person2 = new Person("John McClane", address); 
    session.save(person1); 
    session.save(person2); 
    transaction.commit(); 
    session.close(); 

請讓我知道我在這裏錯過了什麼?

+0

您是否在數據庫模式中添加了唯一約束? – 2011-04-12 14:51:29

+0

No ..:-0但是想知道如果Hibernate的unique =「true」會依賴於模式約束本身,那麼它有什麼用處?那麼唯一=「真」只是一個標記? – haps10 2011-04-12 14:57:55

回答

3

閱讀http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e7576,並找到段落5.1.7.1中的多對一描述。它說:

unique(可選):使用DDL 生成一個唯一約束的 的外鍵列。通過允許將 作爲 property-ref的目標,可以使關聯多重性一對一。

這意味着它被Hibernate的數據庫模式生成工具用來添加一個唯一的約束。如果你不使用它,那麼你必須自己添加這個約束。

+0

啊謝謝!!如果我們沒有使用hibernate爲我們創建DDL,我們應該自己添加約束條件。得到它..(我認爲非null屬性也是相關的,但稍微有點不同,因爲它也會運行時檢查) – haps10 2011-04-13 17:56:04