2014-09-02 94 views
0

我不問這些差異b/w這些2.閱讀hibernate文檔後,我決定實施它們以闡明我的概念。一對多和多對一的xml映射在休眠與連接表

一個鏈接到多個地址

一套持有類地址的對象很多

1人在個人聲明。

CREATE TABLE person_address 
(
    person_id integer NOT NULL, 
    address_id integer NOT NULL, 
    CONSTRAINT person_address_pkey PRIMARY KEY (person_id, address_id), 
    CONSTRAINT fk9e2338ea36645cd5 FOREIGN KEY (person_id) 
     REFERENCES person (person_id) , 
    CONSTRAINT fk9e2338eaa1a53d5f FOREIGN KEY (address_id) 
     REFERENCES address (address_id) , 
    CONSTRAINT person_address_address_id_key UNIQUE (address_id) 
) 

在上面的例子中,Hibernate創建了4個約束。

現在看看其他映射。

多對一

許多人鏈接到一個地址

Address類的Person類的引用。

CREATE TABLE person_address 
(
    person_id integer NOT NULL, 
    address_id integer NOT NULL, 
    CONSTRAINT person_address_pkey PRIMARY KEY (person_id), 
    CONSTRAINT fk9e2338ea246188ab FOREIGN KEY (address_id) 
     REFERENCES address (address_id) , 
    CONSTRAINT fk9e2338eaf88b7809 FOREIGN KEY (person_id) 
     REFERENCES person (person_id) 
) 

正如您所看到的,Hibernate創建了3個約束條件。 由於不同的人鏈接到1個地址,所以PRIMARY KEY是(person_id)是完全有意義的。

我知道明確的差異b/w主鍵和唯一關鍵字。

我的問題是爲什麼Hibernate在第一種情況下創建主鍵爲(person_id,address_id)的組合,即使知道address_id是唯一的並且可以像第二種情況一樣用作主鍵(Many到一)。

編輯:

 <key column="PERSON_ID" /> 
     <many-to-many column="ADDRESS_ID" unique="true" 
       class="org.academy.ansar.UnidirectionalOneToManyMappingWithJoinTable.Address" /> 

指定唯一= 「真」,從多到多對一,一對多改變它

回答

0

...我的問題是爲什麼Hibernate在第一種情況下將主鍵創建爲(person_id, address_id)的組合,即使知道address_id是唯一的並且可以像第二種情況一樣用作主鍵(多對一)

在第一種情況下,表person_address是表,personaddress之間的配對錶。並且使答案真的很明顯,讓我們這些記錄:

Person表

1 - PersonA 
2 - PersonB 

地址表

1 - AddressX 
2 - AddressY 

而現在,我們可以在配對錶person_address這些組合:

personId, addressId 
    1  , 1 
    1  , 2 
    2  , 1 
    2  , 2 
// 2  , 2 - impossible due to primary key 

這是答案

  • addressId獨特
  • personId uniq的
  • 它們的組合是唯一

這就是many-to-many怎麼做工作...

+0

我絕不會問你多少次。第一種情況明確提到是一對多,Hibernate創建了4個約束,這裏也粘貼它:CONSTRAINT person_address_pkey PRIMARY KEY(person_id,address_id), CONSTRAINT fk9e2338ea36645cd5 FOREIGN KEY(person_id) REFERENCES person(person_id), CONSTRAINT fk9e2338eaa1a53d5f FOREIGN KEY(address_id) REFERENCES地址(address_id), CONSTRAINT person_address_address_id_key UNIQUE(address_id)。 ofcourse address_id是獨特的每個休眠。 – 2014-09-03 13:30:24

+0

由Hibernate創建的第一個表具有所有標識符,它是多對多的。其實作爲第二,但我認爲你犯了一個錯誤。如果我錯了,好的,但是你能否擴展你的答案並顯示導致這種情況的映射? – 2014-09-03 13:34:43