2011-07-18 56 views
0

我想知道是否可以很好地將公共實體與JPA映射。如何映射公共實體

什麼是我的共同實體?說我的許多域名實體都有一個相關的圖像。所以,會有像UserProfile -> Image(個人資料圖片)或Event ->* Image(促進活動的圖像,一對多)之類的關係。

使用純SQL我可以有一個imageowner_id列控股UserProfile#IDEvent#ID。因爲我永遠都不需要找到圖片的所有者,而是將圖片發給所有者,所以我不在乎我無法立即分辨圖片5是個人資料圖片還是事件圖片。

我想在JPA層面上,只要我沒有一對多或多對一的關係到Image,因爲他們需要一個反向引用來處理相同的「黑客」。是的,這是問題所在。我無法創建回參考。

想到的唯一可行的方法是創建一個包含所有常見Image字段的abstract Image,然後爲每個關係創建一個具體的子類。合理?

回答

0

我不太明白你如何「純粹的SQL」的方法將工作:如果你想得到一個圖像爲Event#5你也會得到UserProfile#5的圖像,對不對?

另一種方法來模擬這是引進一個連接表。

您可以創建正常連接表在它每種類型與外鍵的所有者和圖像的圖像主人:

@Entity 
public class UserProfile { 
    @OneToOne @JoinTable 
    private Image image; 
    ... 
} 

@Entity 
public class Event { 
    @OneToMany // Unidirectional one-to-many uses join table by default 
    private List<Image> image; 
    ... 
} 

或者,您也可以創建只包含主鍵一個附加表:

@Entity 
public class Images { 
    @OneToMany @JoinColumn 
    private List<Image> images; 
    ... 
} 

@Entity 
public class UserProfile { 
    @OneToOne 
    private Images images; 
    ... 
} 
+0

「我不太明白你如何使用」純SQL「方法:如果你想獲得事件#5的圖像,你也可以得到UserProfile#5的圖像,對吧? 啊,對了,忘了提及我們使用系統範圍內唯一的ID。 –

+0

對於'UserProfile - > Image'的情況,我最終使用了一對一的反向關係(即在user_profile表中存儲爲外鍵的圖像ID)。 –