Java hibernate中带有联接表的一对多和多对一xml映射
我不是在问这两个方面的区别。在阅读了hibernate文档之后,我决定实现它们以澄清我的概念 一对多 1人链接到多个地址 持有类地址对象的集合是亲自声明的Java hibernate中带有联接表的一对多和多对一xml映射,java,hibernate,Java,Hibernate,我不是在问这两个方面的区别。在阅读了hibernate文档之后,我决定实现它们以澄清我的概念 一对多 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), CONSTRAIN
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个约束。
主键是(person_id),这完全有道理,因为不同的人链接到一个地址
我知道主键和唯一关键字之间的明显区别
我的问题是,为什么Hibernate在第一种情况下创建主键作为(person\u id,address\u id)的组合,即使知道address\u id是唯一的,并且可以像在第二种情况下(多对一)一样用作主键
编辑:
指定unique=“true”会将其从多个更改为多个
。。。我的问题是为什么Hibernate在第一种情况下创建主键是(person\u id,address\u id)
,即使知道address\u id
是唯一的,并且可以像在第二种情况下(多对一)一样用作主键
在第一种情况下,tableperson\u address
是to tables、person
和address
之间的配对表。为了让答案变得非常明显,让我们做以下记录:
人员表
1 - PersonA
2 - PersonB
地址表
1 - AddressX
2 - AddressY
现在,我们可以在配对表中找到这些组合个人地址
:
personId, addressId
1 , 1
1 , 2
2 , 1
2 , 2
// 2 , 2 - impossible due to primary key
这就是答案:
不唯一addressId
是不是uniqpersonId
- 它们的组合是独一无二的
这就是
多对多
工作的方式…我绝不会要求你多对多。第一种情况显然是一对多,Hibernate为其创建了4个约束,并将其粘贴在这里:约束person_address_pkey主键(person_id,address_id),约束fk9e2338ea36645cd5外键(person_id)引用person(person_id),约束fk9e2338eaa1a53d5f外键(address_id)引用地址(地址\ id)、约束人地址\地址\ id \密钥唯一(地址\ id)。当然,根据hibernate,地址id是唯一的。hibernate创建的第一个表具有所有标识符,即多对多。事实上是第二次,但我认为你犯了一个错误。如果我错了,好的,但是你能扩展你的答案并显示导致这个问题的映射吗?
personId, addressId
1 , 1
1 , 2
2 , 1
2 , 2
// 2 , 2 - impossible due to primary key