1

这是我的问题-

有两个类OrderPaymentType。一个订单会有一个PaymentType。现在PaymentType是一个抽象类,还有另外两个类被称为扩展CreditCardPaymentType类。在休眠中,它们被建模为 Single_Table 策略。包含一个名为. 我正在按照 HQL 编写,我的目的是急切地加载实体。PaypalPaymentTypePaymentTypeCreditCardPaymentTypeCreditCardNumberCreditCardNumber

session.createQuery("select order from Order as order " +
                "inner join fetch order.paymentType.Unknown");

应该用什么来代替“未知”?由于PaymentType类对类一无所知CrediCardNumber,我可以在上面的查询中放入什么来热切地加载CreditCardNumber

提前致谢。

4

2 回答 2

2

如果我错了,请纠正我。检查下面的代码

session.createQuery("from Order as order " +
"inner join fetch order.paymentType.class = CreditCardPaymentType");

根据网址

在多态持久性的情况下,特殊属性类访问实例的鉴别器值。嵌入在 where 子句中的 Java 类名将被转换为它的鉴别器值。来自猫猫哪里cat.class = DomesticCat

于 2012-07-17T12:25:56.177 回答
2

无论如何,您想做的事情都行不通。

在订单中,您不能创建 PaymentType 类型的实体并使用休眠加载它。PaymentType 是抽象的,因此无法实例化。从 so 数据库加载实体时,Hibernate 需要一个构造函数。所以你不能映射抽象类,你只能映射至少有一个无参数构造函数的实现类。

=> 在映射中Order你必须指定 if order.paymentTypeisCreditCardPaymentTypePaypalPaymentType。这解决了你的问题,因为你知道什么是unknown真正的。

解决您的任务:在数据库端,您可以在一个表中继续处理所有付款类型。在 Java 方面,您有两种可能性(都是一种想法):

  1. 您使 PaymentType 不是抽象的,有两个方法boolean isCreditCardPayment()boolean isPaypalCardPayment(),并且 PaymentType 包含数据库表的所有列。你只使用这个类,你忘记了类PaypalPaymentTypeCreditCardPaymentType.

或者

  1. 在两者的映射中PaypalPaymentTypeCreditCardPaymentType您放置一个 where 条件,确保仅加载正确支付类型的行。在 Order 中删除属性 paymentType 并添加两个属性 paypalPaymentType 和 creditcardPaymentType 作为替代,它们引用了两个 Java 类。加载 时Order,两个属性之一将为空。为方便起见,您可以创建一个方法PaymentType getPaymentType(),它返回非空支付类型,但您不能在 HQL 查询中使用这种便捷方法。
于 2012-06-15T08:50:28.350 回答