2009-11-20 39 views
0

我正在嘗試爲現有數據庫實現繼承JPA。JPA Inheritance Multiple DiscriminatorValues

當前分貝模型如下:

Instrument 
* InstrumentID 
* Description 
* InstrumentTypeID 

InstrumentType 
* InstrumentTypeID 
* StorageClass 

Option 
* InstrumentID 
* (Option specific fields) 

Stock 
* InstrumentID 
* (Stock specific fields) 

有InstrumentType和存儲類之間的多對一的關係。換句話說,List Option和OTC Option均具有存儲類「Option」

在JPA模型中,我有一個抽象類Instrument,鑑別器值設置爲InstrumentTypeID。

問題是選項的子類可以同時擁有InstrumentTypeID 3和5

什麼是JPA模型的最佳方式?

回答

1

你的問題有點混亂,所以我對它的解釋可能不正確。

但是,我懷疑你可以通過將選項分成兩個類來解決你的問題。使選項成爲具有兩個具體子類的抽象類,即ListOption和OTCOption,每個子類都有其自己的鑑別值(3或5)。在兩個子類中可能沒有任何不同的字段,但是這會讓您使用兩個InstrumentTypeID來表示Option。

問題是,這意味着重複您的代碼結構中的InstrumentType表中的知識,這顯然不是一件好事。

如果您想完全使用數據驅動,我認爲您必須更改Option和Stock,以使它們不是Instrument的子類。他們可能可能是InstrumentDetails接口的實現,每個類本身都是一個實體。 InstrumentType也是一個實體。然後,您可以給InstrumentType像一些代碼:

@Entity 
public class InstrumentType { 

    private static final Map<String, Class<? extends InstrumentDetails>> STORAGE_CLASSES = new HashMap<String, Class<? extends InstrumentDetails>>(); 
    static { 
     STORAGE_CLASSES.put("Option", Option.class); 
     STORAGE_CLASSES.put("Stock", Stock.class); 
    } 

    public InstrumentDetails getDetails(Instrument inst) { 
     return getEntityManager().find(STORAGE_CLASSES.get(getStorageClass()), inst.getID()); 
    } 

    // NB implementation of getEntityManager() is left as an exercise to the reader 

} 

而且,爲了方便,對儀器本身的方法:

@Entity 
public class Instrument { 
    public InstrumentDetails getDetails() { 
     return getInstrumentType().getDetails(this); 
    } 
} 

這裏,我從硬存儲類的字符串細節映射類,但是你可以從配置文件或注入動態獲取它,或許可以更容易地添加新的存儲類。