使用连接表将 JPA 双向 @ManyToOne 关系映射到多个表

Posted

技术标签:

【中文标题】使用连接表将 JPA 双向 @ManyToOne 关系映射到多个表【英文标题】:Mapping a JPA bidirectional @ManyToOne relationship to more than one table using join tables 【发布时间】:2015-08-15 05:38:01 【问题描述】:

JPA 和 ORM 的新问题,所以这个问题可能已经过时了。我有以下表格:

CREATE TABLE INSTITUTION (
    inst_id BIGINT PRIMARY KEY,
    :
    :
);

CREATE TABLE PERSON (
    pers_id BIGINT PRIMARY KEY,
    :
    :
);

上述每个表都与另一个表 CONTACTINFO 是一对多的关系

CREATE TABLE CONTACTINFO (
    cont_id BIGINT PRIMARY KEY,
    :
    :
);

在 RDBMS 表中,关系可以映射到两个连接表:

JOIN_CONTACTS_PERSON ( cont_id, pers_id )
JOIN_CONTACTS_INSTITUTION ( cont_id, inst_id )

在 SQL 中,可以通过使用正确的连接表连接所需的表来建立关系,例如:

SELECT *
  FROM Person AS p
  JOIN Join_Contacts_Person AS jt ON p.pers_id = jt.pers_id
  JOIN Contacts AS c ON jt.cont_id = c.cont_id;

在 JPA 中,一对多关系的拥有方必须是“多”方,在本例中为联系人表。但似乎没有任何方法可以使用 JPA 注释从“多”端映射到多个联接表。

我的问题是:1)不可能通过多个连接表映射双向多对一关联吗? ... 2)是否也不能通过两个或多个连接表映射单向多对一关系? ...和... 3) 可能的解决方法是对两个单向映射使用@ManyToMany 注释并使“一个”侧成为每个关系的拥有侧?

【问题讨论】:

【参考方案1】:

但似乎没有任何方法可以使用 JPA 注释从“多”端映射到多个联接表

你在这里有一个误解。您似乎认为存在一个 ManyToOne 关联,并且您希望将其映射到多个连接表上。事实并非如此。您在这里有两个不同的关联,每个关联都有自己的连接表:

    一个人有很多联系人,这是使用联系人和个人之间的连接表映射的 一个机构有很多联系人,这是使用机构和人员之间的连接表映射的

所以您的联系人实体如下所示:

@Entity
public class Contact
    @Id
    private Long id;

    @ManyToOne
    @JoinTable(name = "JOIN_CONTACTS_PERSON", 
               joinColumns=
                   @JoinColumn(name="CONT_ID"),
               inverseJoinColumns=
                   @JoinColumn(name="PERS_ID"))
    private Person owningPerson;

    @ManyToOne
    @JoinTable(name = "JOIN_CONTACTS_INSTITUTION", 
               joinColumns=
                   @JoinColumn(name="CONT_ID"),
               inverseJoinColumns=
                   @JoinColumn(name="INST_ID"))
    private Institution owningInstitution;

    // ...

【讨论】:

确实是一种误解。非常感谢您的澄清。

以上是关于使用连接表将 JPA 双向 @ManyToOne 关系映射到多个表的主要内容,如果未能解决你的问题,请参考以下文章

双向 JPA OneToMany/ManyToOne 关联中的“关联的反面”是啥?

如何响应 Spring RestController 返回 ManyToOne 双向 JPA 实体对象?

如何与 Spring Data REST 和 JPA 保持双向关系?

带有连接表的双向@ManyToOne 创建重复键

JPA @ManyToOne 用于休眠

层次结构中 JPA 实体之间的双向关系