使用 join tables 将 JPA 双向 @ManyToOne 关系映射到多个 table

Mapping a JPA bidirectional @ManyToOne relationship to more than one table using join tables

JPA 和 ORM 的新问题,所以这个问题可能是老问题了。我有以下 tables:

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

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

以上每个 table 都与另一个 table、CONTACTINFO

具有一对多关系
CREATE TABLE CONTACTINFO (
    cont_id BIGINT PRIMARY KEY,
    :
    :
);

在 RDBMS tables 中,关系可以用两个连接映射 tables:

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

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

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 中,一对多关系的拥有方必须是 'many' 方,在本例中是联系人 table。但是似乎没有任何方法可以使用 JPA 注释从 'many' 端映射到多个 Join Table。

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

But there doesn't appear to be any way to map to more than one Join Table from the 'many' side using JPA annotations

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

  1. 一个人有很多联系人,这是使用联系人和个人之间的联接 table 映射的
  2. 一个机构有很多联系人,这是使用机构和个人之间的联接 table 映射的

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

@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;

    // ...
}