2012-12-14 119 views
7

中加入包含非主鍵列的表我正在使用遺留系統,需要從數據庫讀取一些信息。下面是表關係一對多關聯 - 在JPA

供應商(廠商ID - PK,vendorEid,名)
VendorContactBridge(bridgeId -pk,vendorEid,contactEid)
聯繫(使用ContactID -pk,contactEid,電話)

vendorEid和contactEid不是表格的主鍵,而是用作Join表格VendorContactBridge中的連接列。

供應商實體 -

@Entity 
@Table(name="Vendor") 
public class Vendor implements Serializable{ 

@Id 
@Column(name="VENDORID") 
private BigDecimal vendorId; 

@Column(name="VENDOREID") 
private BigDecimal vendorEid; 

@OneToMany(fetch = FetchType.EAGER) 
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")}, 
inverseJoinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTACTEID")}) 
private Set<Contact> vendorContact; 
} 

聯繫實體 -

@Entity 
@Table(name="CONTACT") 
public class Contact implements Serializable{ 

@Id 
@Column(name="CONTACTID") 
private BigDecimal contactId; 

@Column(name="CONTATEID") 
private BigDecimal contactEId; 

@ManyToOne 
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTATEID")}, 
inverseJoinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")}) 
private Vendor vendor; 
} 

運行查詢時,得到下面的異常

SecondaryTable JoinColumn不能引用非主鍵。

我刪除了我在Vendor實體中給出的Eager fetch,我沒有得到任何異常但它不加載集合。關聯有什麼問題?

回答

10

根據頁面上的JPA 2.0 specs第11.1.21 JoinColumn annotaion 379

支持引用的列不屬於 引用的表的主鍵列是可選的。使用這種映射的應用程序將不可移植。

看來Hibernate選擇不實現這個可選部分。其他實現可能。我在EclipseLink上試過它,但那個也不起作用(它驗證失敗)。

我看到兩個解決方法。一種是調整你的模式以使用主鍵,這從數據庫設計理論的角度來看是正確的。然而,這可能不是一個選項,因爲其他軟件取決於這個模式,這留下了選項二。通過不改變JPA中的關係來解決它,只需使用eid並自己檢索相關對象即可。

+0

選項2:你的意思是,我應該做兩個DB調用一個基於VendorEid和再次從VendorContactBridge越來越ContactEid上聯繫上ContactEid ASED?我的理解是否正確? – Pankaj

+0

這將是基本原則。但最好使用本機查詢,因爲您可以執行連接,並使用單個sql查詢來檢索對象。 – Eelke