使用连接表将 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 实体对象?