2012-05-02 52 views
3

我遇到了一個與此非常相似的問題:How do I join tables on non-primary key columns in secondary tables? 但我不確定是否可以應用相同的解決方案。如何使用外鍵將兩個表映射到一個實體?

我有兩個表像這樣:

CREATE TABLE CUSTOMER 
(
    CUSTOMER_ID INTEGER NOT NULL, 
    DETAIL_ID INTEGER NOT NULL, 
    PRIMARY KEY(CUSTOMER_ID), 
    CONSTRAINT cust_fk FOREIGN KEY(DETAIL_ID) REFERENCES DETAILS(DETAIL_ID) 
) 

CREATE TABLE DETAILS 
(
    DETAIL_ID INTEGER NOT NULL, 
    OTHER INTEGER NOT NULL, 
    PRIMARY KEY(DETAIL_ID) 
) 

我想這些表映射到稱爲Customer一個類,所以我有:

@Entity 
@Table(name = "CUSTOMERS") 
@SecondaryTable(name = "DETAILS", [email protected](name="DETAIL_ID")) 
public class Customer { 
    @Id 
    @GeneratedValue 
    @Column(name = "CUSTOMER_ID") 
    private Integer id; 

    @Column(table = "DETAILS", name = "OTHER") 
    private Integer notes; 

    // ... 
} 

,但是這隻有當DETAIL_ID匹配主表中的CUSTOMER_ID

所以我的問題是:我如何在我的主表中使用外鍵字段加入輔助表的主鍵?


UPDATE 我試圖設置:

@SecondaryTable(name = "DETAILS", [email protected](name="DETAIL_ID", referencedColumnName="DETAIL_ID"))

但是當我運行的應用程序,我得到這個異常:

org.hibernate.MappingException: Unable to find column with logical name: DETAIL_ID in org.hibernate.mapping.Table(CUSTOMERS) and its related supertables and secondary tables

+0

好的,所以你有兩張桌子,你想把它們加入一張桌子嗎? –

+0

@SerenityStackHolder是的,我想要在單個實體上映射兩個表。但是我在輔助表的主表中有一個外鍵。 – davioooh

回答

0

可以使用referenceColumnName的屬性註釋將聯接列定義到引用的表。事實上,通過組合使用name/referencedColumnName,你可以在任意兩端進行連接,限制條件是如果找到重複項,你的ORM提供者將拋出一個異常。

+0

我更新了我的問題 – davioooh

3

對於任何尋找答案的人來說,使用@SecondaryTable不是用非主鍵列連接兩個表的方法,因爲Hibernate默認會嘗試通過它們的主鍵來協調這兩個表;你必須使用@OneToMany審查http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/一個解決方案,這裏有萬一的代碼片段網址停止工作:

Customer類:

@Entity 
@Table(name="CUSTOMERS") 
public class Customer { 

    @Id 
    @GeneratedValue 
    @Column(name="CUSTOMER_ID") 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name="DETAIL_ID") 
    private Details details; 

    // Getter and Setter methods... 
} 

詳細類別:

@Entity 
@Table(name="DETAILS") 
public class Details { 

    @Id 
    @GeneratedValue 
    @Column(name="DETAIL_ID") 
    private int detailId; 

    @Column(name="OTHER") 
    private String other; 

    @OneToMany(mappedBy="details") 
    private Set<Customer> customers; 

    // Getter and Setter methods... 
} 

這是很容易通過使用以下代碼休眠可訪問:

Session session = HibernateUtil.getSessionFactory().openSession(); 
Query query = session.createQuery("select id, details.other from Customer"); 

我希望這能幫助那些花費數小時尋找像我一樣達到這個目標的人。

相關問題