【问题标题】:Mapping a JPA bidirectional @ManyToOne relationship to more than one table using join tables使用连接表将 JPA 双向 @ManyToOne 关系映射到多个表
【发布时间】: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 注释并使“一个”侧成为每个关系的拥有侧?

【问题讨论】:

    标签: java jpa orm one-to-many jointable


    【解决方案1】:

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

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

    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;
    
        // ...
    }
    

    【讨论】:

    • 确实是一种误解。非常感谢您的澄清。
    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多