hibernate中的一对多和多对一xml映射使用Join表

时间:2014-09-02 19:05:36

标签: java hibernate

我不是在询问这两个方面的差异2.在阅读了hibernate文档后,我决定实现它们以澄清我的概念。

一对多

1人与多个地址相关联

一个包含类Address对象的Set在Person中声明。

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个约束。 完全意义上PRIMARY KEY是(person_id),因为不同的人被链接到1个地址。

我知道明确的差异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 =&#34; true&#34;将其从多对多更改为一对多

1 个答案:

答案 0 :(得分:0)

  

...我的问题是为什么Hibernate在第一种情况下创建主键是(person_id, address_id)的组合,即使知道address_id是唯一的,也可以用作主键,就像在第二种情况下(多对一)

在第一种情况下,表格 person_address 是表格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的工作原理......