8

我一直在尝试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);

然后我在映射 xml中尝试了一些东西。在一些不成功的尝试之后,我读到您需要三个表来进行多对多映射,正如我的一个问题的答案所说。

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

4

4 回答 4

9

第三个表用作定义多对多关系的联结表。在您的示例中,我假设 aPerson可以有多个addresses,并且地址可以属于多个People这种关系不能使用两个表来建模。

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

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

Table A
ID_A

Table B
ID_B

Table C
ID_A
ID_B
于 2013-06-25T08:35:50.953 回答
6

因为关系的性质。

如果映射是一对一的,那么您可以向表中添加一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 | 
+---------------------+

一对多也是如此:如果 aPerson可以有多个Addresses,那么Addresstable 中就会有多个相同的元组person_id

 Address
+---------------------+
|id|p_id|address      |
+---------------------+
| 1|  1 |some street 1| //two addresses point to one person
+---------------------+
| 2|  1 |new street 5 | 
+---------------------+

但是,如果一个Person可以有多个Addresses,而且,一个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 | 
+---------+
于 2013-06-25T08:37:08.340 回答
2

嗯,我不确定,但我认为他是在谈论在他的映射中创建“第三类”而不是真正的“第三表”(否则他甚至不会谈论休眠映射)。所以我会假设他只是在为我的答案而为他的映射而苦苦挣扎(以后对他的休眠映射仍然有用):

感谢@JoinTable 注释,您不必为第三个表创建实体。如果您的表之间存在多对多关系,则只需创建 2 个实体“Person”和“Address”,并且每一侧的 @JoinTable 注释将应用多对多魔法而无需创建它们之间的第三个表的实体。

除非您的第三个表有一些额外的列,然后在这种情况下您别无选择,您将不得不为第三个表创建一个特定的实体(否则您无法仅使用“Person”获得该额外的列和“地址”实体)。

一些对您的映射有用的链接:

http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/ http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-表外列注释/

于 2013-06-25T08:49:31.720 回答
0

我使用带有 JPA 注释的 ManyToMany,我需要您的宝贵建议。(假设人员和地址。相同的地址是指更多的人(住在同一地址))。我必须从该地址中删除一个人。

 Person p1 = new Person();
  Person p2 = new Person();
    Address add1 = new Address();

  p1.add(add1);
  p2.add(add1);

对两个人使用相同的添加参考。做的也不错

add1.add(p1)  ;
  add1.add(p2)  ;

然后在合并或持久化时适当地映射。

p1 -​​ 添加1 p2 - 添加1

当我这样做时,我必须单独删除 p2

p2.removeAddress(add1)
    removeAddress(add1) { coll.remove(add1) }

发生的情况是它删除了地址条目,并再次由 Hibernate jpa 提供者再次尝试在地址实体上持久化并说“已删除的实体传递给持久性”并且发生事务回滚。我正在映射为

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "XXXX", joinColumns = { @JoinColumn(name = "X1_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "X2_ID", nullable = false, updatable = false) })
    private Collection<Parser> parsers;


    Please share your ideas.
于 2014-01-08T13:11:53.273 回答