2012-11-07 65 views
5

我目前正在努力將現有的數據庫模式映射到jpa實體,並且在很多奇怪的問題中,我陷入了這個問題。是否有可能在輔助表上有鑑別器列jpa

我有兩個表,與此類似:

Table 1   Table 2   
|Service  | |Servicetype  | 
|servicetype | |Servicecategory | 
|   | |    | 

servicetype表1是在表中的兩個的外鍵的服務類型。 但是,表1中的服務基於它們所屬的類別具有非常不同的行爲(雖然有100多種服務類型,但只有4種類別) 我希望能夠將表1映射到四個不同的實體類,基於其服務類型的類別。

這是我到目前爲止有:從這個延伸buth具有不同discriminatorvalue,不工作

@Entity 
@Table(name = "table1") 
@DiscriminatorColumn(name = "servicecategory", discriminatorType =   
    discriminatorType.INTEGER) 
@DiscriminatorValue("1") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@SecondaryTable(name = "table2", 
pkJoinColumns = 
@PrimaryKeyJoinColumn(name = "servicetype", referencedColumnName = 
"servicetype")) 
public class AbstractService implements Serializable { 
...etc 

和4班,因爲的EclipseLink,我使用它,試圖查詢table1中的servicecategory的值。

是否有可能用jpa表示這樣的映射,或者我應該在每個查詢上執行「where servicecategory = ?」的映射。

+0

您是否嘗試在定義中指定表和列名稱? 「table2.servicecategory」 – Chris

+0

在鑑別器列註釋中?是。但生成的查詢已經通過別名指定了表,所以它只是變成$ tablealias.table2.servicecategory – vruum

回答

1

請在EclipseLink中增強對此功能的支持。 JPA解決方案是使用輔助表切換主表 - 這可能會導致插入順序問題,而外鍵將引用表2中的Servicetype。

EclipseLink特定的解決方案是使用定製器來更改用於描述符字段的表。將@Customizer標籤添加到實體並使用方法指定一個類:

public void customize(ClassDescriptor descriptor) { 
    descriptor.getInheritancePolicy().getClassIndicatorField().setTable(
     descriptor.getTable("table2")); 
} 
+1

感謝您的回答。 '@ Customizer'標籤看起來很有用,但我們試圖堅持標準,已經從休眠狀態轉換到被提供者特定的東西咬了。爲了將來的參考,我最終創建了一個視圖,其中加入了servicecategory,並單獨處理插入操作,因爲我主要是一個只讀表。 – vruum