持久子类的多个鉴别器列

flvlnr44  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(368)

我遇到了一个非常特别的问题。使用openjpa(kodo4.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的自定义鉴别器策略,那就太好了,因为我预感这可能是一个合理的解决方案(尽管我更喜欢独立于供应商的解决方案)
谢谢

dz6r00yl

dz6r00yl1#

我们倒回去吧。
鉴别器策略定义在层次结构中鉴别相关实体的列的类型。在JPA1.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 { ... }

如果您将is single table inheritation策略用作默认值,则此设置意味着层次结构中的所有这些实体都将Map到父类的数据库表,这意味着您的数据库中将有一个foo表,其中包含类foo的所有属性,bar和baz加上一个名为type的鉴别器列,其类型为string(很可能是varchar变量,长度为5),对于每个实体类型,持久化时将自动插入相应的鉴别器值。
当您使用jpql查找bar或baz实体时,jpa将能够从foo表中查找实体(因为那是父实体的表),并且通过依赖discriminator列的内容,您的jpa提供者将能够区分创建一些bar或baz实体。
如果将鉴别器类型设置为integer或char,则可以分别为值1、2、3或“a”、“b”、“c”等写入。
现在是openjpa问题。
当然,用openjpa无法轻松地指定多个鉴别器值,但是您可以创建一些更复杂的实体层次结构,因此如果您能够修改模式,您可以创建一个vehicle实体、一辆车、一艘船以及一个expensiveboat和一个expensivecar。
如果您必须坚持您的模式,我猜(但是fixme)您使用的是joined或table per class继承策略,这意味着您不能使用jpa提供的鉴别器特性。

相关问题