1

我遇到了一个非常特殊的问题。使用 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 的自定义鉴别器策略会很棒,因为我有预感它可能是一个合理的解决方案(即使我更喜欢独立于供应商的解决方案)

非常感谢

4

1 回答 1

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 表,其中包含所有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 以及两者昂贵的船和昂贵的汽车。

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

于 2009-11-13T06:53:49.533 回答