为什么我需要第三个表进行多对多映射?为什么我不能只使用两张桌子?

Suh*_*pta 8 java many-to-many hibernate hibernate-mapping

我一直在试图many to many两个类之间的关系PersonAddress.我不知道,但在某个地方我并没有按照正确的方向思考.例如,对于多对多映射,我制作了两个表

CREATE TABLE person(p_id INTEGER,p_name TEXT,PRIMARY KEY(p_id));
CREATE TABLE address(a_id INTEGER,address TEXT);
Run Code Online (Sandbox Code Playgroud)

然后我在映射xml中尝试了一些东西.经过一些不成功的尝试后,我读到你需要三个表进行多对多的映射,就像我的一个问题的答案所说的那样.

请解释一下这个原因?为什么我需要第三张桌子?为什么我不能只与两个表建立关联?

Kev*_*sox 9

第三个表用作定义多对多关系的联结表.在您的示例中,我假设一个Person可以有多个addresses,一个地址可以属于多个People. 无法使用两个表对此关系进行建模.

您可以尝试简单地包括外键AddressPerson表或外键PersonAddress表.这些映射中的每一个都具有one一侧,one特定实体的含义与另一侧相对应many.这些选项都不能实现这种many to many关系,并且需要使用第三个表来映射更复杂的关系.

为了映射为many to many您需要能够将两个实体的多个实例相互关联.传统上通过以下方式完成:

Table A
ID_A

Table B
ID_B

Table C
ID_A
ID_B
Run Code Online (Sandbox Code Playgroud)


dar*_*jan 6

由于关系的性质.

如果映射是一对一的,那么你可以person_idAddress表中添加一列,每个Address元组只指向一个Person.

 Address
+---------------------+
|id|p_id|address      |
+---------------------+
| 1|  1 |some street 1| //one address uniquely points to one person
+---------------------+
| 2|  2 |new street 5 | 
+---------------------+
Run Code Online (Sandbox Code Playgroud)

对于一对多也是如此:如果一个Person可以有多个Addresses,那么Address表中会有多个元组具有相同的元组person_id.

 Address
+---------------------+
|id|p_id|address      |
+---------------------+
| 1|  1 |some street 1| //two addresses point to one person
+---------------------+
| 2|  1 |new street 5 | 
+---------------------+
Run Code Online (Sandbox Code Playgroud)

但是,如果一个人Person可以拥有多个Address,那么,一个人Address可以属于多个Persons?然后表person_id中的一列Address是不够的,因为一个列Address可能与许多Persons有关!因此,您需要第三个表来关联所有Persons和Addresses对.

 Assoc table
+---------+
|a_id|p_id|    
+---------+
| 1  |  1 | //one address for two persons
+---------+
| 1  |  2 | 
+---------+
| 2  |  3 | //two addresses for the same person
+---------+
| 3  |  3 | 
+---------+
Run Code Online (Sandbox Code Playgroud)