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

时间:2015-08-15 05:38:01

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

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注释进行两个单向映射,并使" one"支持每个关系的拥有方?

1 个答案:

答案 0 :(得分:1)

  

但似乎没有任何方法可以使用JPA注释从'many'方面映射到多个Join Table

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

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

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

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