JPA继承多个鉴别器值

JPA继承多个鉴别器值,jpa,Jpa,我正在尝试为现有数据库实现带有继承的JPA 当前数据库模型如下所示: Instrument * InstrumentID * Description * InstrumentTypeID InstrumentType * InstrumentTypeID * StorageClass Option * InstrumentID * (Option specific fields) Stock * InstrumentID * (Stock specific fields)

我正在尝试为现有数据库实现带有继承的JPA

当前数据库模型如下所示:

Instrument
 * InstrumentID
 * Description
 * InstrumentTypeID

InstrumentType
 * InstrumentTypeID
 * StorageClass

Option
 * InstrumentID
 * (Option specific fields)

Stock
 * InstrumentID
 * (Stock specific fields)
InstrumentType和存储类之间存在多对一关系。换句话说,List选项和OTC选项都有存储类“Option”

在JPA模型中,我有一个抽象类Instrument,其鉴别器值设置为InstrumentTypeID

问题是Option子类可以同时具有InstrumentTypeID 3和5


在JPA中建立这种模型的最佳方式是什么?

你的问题有点令人困惑,因此我对它的解释可能不正确

然而,我怀疑您可以通过将选项分为两个类来解决问题。使Option成为一个抽象类,包含两个具体的子类ListOption和OTCOption,每个子类都有自己的鉴别器值(3或5)。这两个子类中可能没有任何不同的字段,但这将允许您使用这两个InstrumentTypeID来表示选项

问题是,这意味着在代码结构中复制InstrumentType表中的知识,这显然不是一件好事

如果你想让它完全由数据驱动,我认为你必须改变期权和股票,使它们不是工具的子类。它们可能是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);
    }
}