簡體   English   中英

帶有聯接表的休眠中的一對多和多對一xml映射

[英]One to Many and Many to One xml mapping in hibernate With Join tables

我並不是在問這些b / w的區別。2。閱讀了休眠文檔之后,我決定實現它們以闡明我的概念。

一對多

1個人與許多地址相關聯

在Person中聲明了保存Address類的對象的Set。

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個約束。

現在看看其他映射。

多對一

許多人鏈接到一個地址

Person類中Address類的引用。

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是唯一的並且可以像第二種情況(多對一)一樣用作主鍵。

編輯:

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

指定unique =“ true”會將其從多對多更改為一對多

...我的問題是為什么Hibernate在第一種情況下將主鍵創建為(person_id, address_id)組合,即使知道address_id是唯一的,也可以像第二種情況一樣用(person_id, address_id)(一)

在第一種情況下,表person_address是在table, personaddress之間的配對表。 為了使答案真正顯而易見,讓我們保留以下記錄:

人表

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工作...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM