Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate中带有联接表的一对多和多对一xml映射_Java_Hibernate - Fatal编程技术网

Java hibernate中带有联接表的一对多和多对一xml映射

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

我不是在问这两个方面的区别。在阅读了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),
  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
是唯一的,并且可以像在第二种情况下(多对一)一样用作主键

在第一种情况下,table
person\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
    不唯一
  • personId
    不是uniq
  • 它们的组合是独一无二的

这就是
多对多
工作的方式…

我绝不会要求你多对多。第一种情况显然是一对多,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