我遇到了一个非常特别的问题。使用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的自定义鉴别器策略,那就太好了,因为我预感这可能是一个合理的解决方案(尽管我更喜欢独立于供应商的解决方案)
谢谢
1条答案
按热度按时间dz6r00yl1#
我们倒回去吧。
鉴别器策略定义在层次结构中鉴别相关实体的列的类型。在JPA1.x中,它可以是字符串(这是默认值)、字符和整数。例子:
如果您将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提供的鉴别器特性。