2015-08-15 82 views
0

与JPA和ORM一起使用,所以此问题可能是旧帽子。我有以下表:使用连接表将JPA双向@ManyToOne关系映射到多个表

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关联,并且您想将它映射到多个连接表上。事实并非如此。你有两个不同的协会在这里,每个人都有自己的连接表:

  1. 一个人有很多的接触,这是用联系和人
  2. 一个机构有多次接触,和之间的连接表mappped这是使用和单位信息的人之间的连接表

所以,你跟实体看起来像下面的映射:

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

    // ... 
} 
+0

一种误解,确实如此。非常感谢您的澄清。 – scottb