Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 持久子类的多个鉴别器列_Java_Jpa_Openjpa - Fatal编程技术网

Java 持久子类的多个鉴别器列

Java 持久子类的多个鉴别器列,java,jpa,openjpa,Java,Jpa,Openjpa,我遇到了一个非常特殊的问题。使用OpenJPA(KODO 4.1)有没有一种方法可以使用多个列作为鉴别器列 我的问题是我有一个表结构(当然我修改的能力有限),类似于: Table VEHICLE EXPENSIVE_CAR CHEAP_CAR EXPENSIVE_BOAT CHEAP_BOAT ---------------------------------------------------------------------------------

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

非常感谢

让我们从头开始

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

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

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

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

现在是OpenJPA问题

好吧,用OpenJPA无法轻松指定多个鉴别器值,但您可以创建一些更复杂的实体层次结构,因此如果您能够修改模式,您可以创建一个车辆实体、一辆汽车、一艘船只以及一个ExpensiveBoat和一个ExpensiveCar


如果你必须坚持你的模式,我想(但要修正我)您使用的是JOIN或table per class继承策略,这意味着您不能使用JPA提供的鉴别器功能。

当您无法访问架构时,不强制使用JOIN或table per class策略,但通常这是唯一有意义的IRL策略。
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 { ... }