gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:14:14 26 4
gpt4 key购买 nike

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 注释并使“一”方成为每个关系的拥有方?

最佳答案

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

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

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

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

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

// ...
}

关于java - 使用联接表将 JPA 双向 @ManyToOne 关系映射到多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com