使用单个表继承Hibernate

时间:2011-11-19 14:29:24

标签: java hibernate inheritance orm

在我们的系统中,我们存储订单。我们的项目中始终有客户特定的代码,但我们尽可能地进行标准化。现在我正在用Hibernate设置一个测试,看看我们是否可以使用它来改进我们的数据访问对象。我有一些问题需要了解Hibernate继承的可能性。让我概述一下这个问题:

我们有4层软件:

  1. 核心库
  2. 客户特定库(核心扩展)
  3. 应用程序(使用核心和客户特定库的应用程序)
  4. 数据库
  5. 核心库

    在核心库中,我们有关于订单的以下模型

    1. IOrder(界面)
    2. 订单(类,核心订单实施,默认实施)
    3. 假设订单具有以下默认字段:

      • ID
      • CUSTOMER_NAME
      • ORDER_DATE
      • DELIVERY_DATE

      客户特定库

      在客户特定的库中,我们有关于订单的以下内容:

      1. CustomerOrder(订单上的类,扩展名)。
      2. 现在,订购我们系统的客户除了上述字段外,还希望存储国家/地区和优先级。客户特定字段为:

        • COUNTRY
        • PRIORITY

        应用

        应用程序通过工厂加载正确的Order类(Order或CustomerOrder)。工厂知道是否有客户特定的实施。

        数据库

        在de数据库中,我们希望有1个表(出于性能原因),我们的核心/默认表(因此没有任何客户特定的扩展名)将如下所示:

        create table ORDER
        (
            OR_ID VARCHAR2(10) not null constraint OR_ID_PK primary key,
            OR_CUSTOMER_NAME VARCHAR2(20),
            OR_ORDER_DATE datetime,
            OR_DELIVERY_DATE datetime
        );
        

        对于需要额外两个字段的客户,我们将创建相同的表:

        create table ORDER
        (
            OR_ID VARCHAR2(10) not null constraint OR_ID_PK primary key,
            OR_CUSTOMER_NAME VARCHAR2(20),
            OR_ORDER_DATE datetime,
            OR_DELIVERY_DATE datetime,
            OR_COUNTRY VARCHAR2(20),
            OR_PRIORITY NUMBER
        );
        

        Java / Hibernate

        现在我的问题是如何使用Hibernate仅使用1个表在Java中建模。核心Order实体不知道CustomerOrder中可用的任何额外列。我在Hibernate上结合继承调查了一些选项,例如使用策略InheritanceType.SINGLE_TABLE。但我认为这需要一个鉴别器专栏,我没有。

        我对Hibernate有什么选择?

2 个答案:

答案 0 :(得分:1)

在这种情况下,您不会同时拥有两种实体(Order和CustomerOrder)。如果没有自定义,则只有Orders,如果有自定义,则只有CustomerOrders。

事实上,您可以假设您始终只有CustomerOrder,但此类并非完全在您的控制之下,而是可以由客户的另一个替换。

所以我可能会使Order成为MappedSuperclass(即一个不构成实体的类,但具有由实体继承的持久字段)。

在扩展jar中,可以由客户自定义,我将定义CustomerOrder实体,它只会扩展Order而不添加任何其他字段。此CustomerOrder类将以源代码形式提供给客户,客户可以使用其他字段替换自己的实现。

答案 1 :(得分:1)

我不知道我是否做对了,但似乎你有两个继承Order的Order和CustomerOrder类。如果这是真的,那么单表策略适合没有任何配置,并且鉴别器列是类名,因此如果记录属于Order,则您将Order作为鉴别器值并且如果它是CustomerOrder您是'我将CustomerOrder作为鉴别器值。这是hibernate的默认行为,您可以对其进行修改。