Suh*_*pta 8 java many-to-many hibernate hibernate-mapping
我一直在试图many to many两个类之间的关系Person和Address.我不知道,但在某个地方我并没有按照正确的方向思考.例如,对于多对多映射,我制作了两个表
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中尝试了一些东西.经过一些不成功的尝试后,我读到你需要三个表进行多对多的映射,就像我的一个问题的答案所说的那样.
请解释一下这个原因?为什么我需要第三张桌子?为什么我不能只与两个表建立关联?
第三个表用作定义多对多关系的联结表.在您的示例中,我假设一个Person可以有多个addresses,一个地址可以属于多个People. 无法使用两个表对此关系进行建模.
您可以尝试简单地包括外键Address的Person表或外键Person的Address表.这些映射中的每一个都具有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)
由于关系的性质.
如果映射是一对一的,那么你可以person_id在Address表中添加一列,每个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)
| 归档时间: |
|
| 查看次数: |
2870 次 |
| 最近记录: |