在我们的系统中,我们存储订单。我们的项目中始终有客户特定的代码,但我们尽可能地进行标准化。现在我正在用Hibernate设置一个测试,看看我们是否可以使用它来改进我们的数据访问对象。我有一些问题需要了解Hibernate继承的可能性。让我概述一下这个问题:
我们有4层软件:
在核心库中,我们有关于订单的以下模型
假设订单具有以下默认字段:
在客户特定的库中,我们有关于订单的以下内容:
现在,订购我们系统的客户除了上述字段外,还希望存储国家/地区和优先级。客户特定字段为:
应用程序通过工厂加载正确的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
);
现在我的问题是如何使用Hibernate仅使用1个表在Java中建模。核心Order实体不知道CustomerOrder中可用的任何额外列。我在Hibernate上结合继承调查了一些选项,例如使用策略InheritanceType.SINGLE_TABLE。但我认为这需要一个鉴别器专栏,我没有。
我对Hibernate有什么选择?
答案 0 :(得分:1)
在这种情况下,您不会同时拥有两种实体(Order和CustomerOrder)。如果没有自定义,则只有Orders,如果有自定义,则只有CustomerOrders。
事实上,您可以假设您始终只有CustomerOrder,但此类并非完全在您的控制之下,而是可以由客户的另一个替换。
所以我可能会使Order成为MappedSuperclass(即一个不构成实体的类,但具有由实体继承的持久字段)。
在扩展jar中,可以由客户自定义,我将定义CustomerOrder实体,它只会扩展Order而不添加任何其他字段。此CustomerOrder类将以源代码形式提供给客户,客户可以使用其他字段替换自己的实现。
答案 1 :(得分:1)
我不知道我是否做对了,但似乎你有两个继承Order的Order和CustomerOrder类。如果这是真的,那么单表策略适合没有任何配置,并且鉴别器列是类名,因此如果记录属于Order,则您将Order作为鉴别器值并且如果它是CustomerOrder您是'我将CustomerOrder作为鉴别器值。这是hibernate的默认行为,您可以对其进行修改。