2015-08-15 90 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