【问题标题】:multiple discriminator columns for persistent subclasses持久子类的多个鉴别器列
【发布时间】:2009-11-04 15:32:33
【问题描述】:

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

非常感谢

【问题讨论】:

    标签: java jpa openjpa


    【解决方案1】:

    让我们从后面开始。

    鉴别器策略定义了区分层次结构中相关实体的列的类型。在 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 提供的鉴别器功能。

    【讨论】:

    • 当您无权访问架构时,不强制使用joined 或table_per_class 策略,但通常这是唯一有意义的IRL 策略。
    猜你喜欢
    • 2011-12-20
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多