用于持久子类的多个鉴别器列

时间:2009-11-04 15:32:33

标签: java jpa openjpa

我用一个非常特殊的问题来打击我自己。使用OpenJPA(KODO 4.1)有一种方法可以使用多个列作为鉴别器列吗?

我的问题是我有一个表格结构(当然我修改的能力有限)与此相似:

Table  VEHICLE      EXPENSIVE_CAR  CHEAP_CAR       EXPENSIVE_BOAT    CHEAP_BOAT
---------------------------------------------------------------------------------
       HORSE_POWER  LUXURY_ACC     CLASIFICATION   SIZE              SIZE
       MEDIUM       EXTRAS                         TV_SIZE
       IS_EXPENSIVE CLASIFICATION

如果介质会区分船只和汽车,而且价格昂贵则会在昂贵或便宜的情况下区别对待。

那么,有没有办法用OpenJPA提供的继承功能来实现这一点(我知道hibernate可以使用鉴别器公式,但我试图不从默认的JPA提供程序切换)。

如果你可以告诉我有关OpenJPA的自定义discriminator strategies的话会很好,因为我有预感,这可能是一个合理的解决方案(即使我更喜欢供应商独立的解决方案)

非常感谢

1 个答案:

答案 0 :(得分:0)

让我们开始倒退。

判别器策略定义用于区分层次结构中相关实体的列的类型。在JPA 1.x中,它可以是字符串(这是默认值),字符和整数。 例如:

import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 5)
@DiscriminatorValue("FOO")
public class Foo { ... }

@Entity
@DiscriminatorValue("BAR")
public class Bar extends Foo { ... }

@Entity
@DiscriminatorValue("BAZ")   
public class Baz extends Baz { ... }

如果您使用的是单表继承策略作为默认值,则此设置意味着层次结构中的所有这些实体将映射到父类的数据库表,这意味着您将拥有一个FOO表db具有类Foo,Bar和Baz的所有属性加上一个名为TYPE的鉴别器列,其字符串类型(很可能是一些varchar-variant,长度为5),对于每个实体类型,相应的鉴别器值将在持久化时自动插入

当您使用JPQL查找Bar或Baz实体时,JPA将能够从FOO表中找到实体(因为这是父实体的表),并且依赖于鉴别器列的内容,您的JPA提供程序将能够区分创建一些Bar或Baz实体。

如果你将鉴别器类型设置为INTEGER或CHAR,那么你可以分别写入值1,2,3或“A”,“B”,“C”等。

现在转到OpenJPA问题。

AFAIK无法使用OpenJPA轻松指定多个鉴别器值,但您可以创建一些更复杂的实体层次结构,因此如果您能够修改架构,则可以创建一个Vehicle实体,一个Car,一个Boat以及ExpensiveBoat和ExpensiveCar。

如果你必须坚持你的架构,我猜(但是FIXME)你正在使用每个类继承策略的连接或表,这意味着你不能使用JPA提供的鉴别器功能。