我不是在询问这两个方面的差异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;将其从多对多更改为一对多
答案 0 :(得分:0)
...我的问题是为什么Hibernate在第一种情况下创建主键是
(person_id, address_id)
的组合,即使知道address_id
是唯一的,也可以用作主键,就像在第二种情况下(多对一)。
在第一种情况下,表格 person_address
是表格person
和address
之间的配对表。为了使回答非常明显,让我们拥有这些记录:
人员表
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
的工作原理......