Hibernate HQL和继承

时间:2012-06-15 08:00:54

标签: hibernate inheritance hql

这是我的问题 -

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

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

应该取代什么“未知”?由于PaymentType类对CrediCardNumber类一无所知,因此我可以在上述查询中加入CreditCardNumber

提前致谢。

2 个答案:

答案 0 :(得分:2)

无论如何,你想做什么都不行。

按顺序,你不能创建一个PaymentType类型的实体,并用hibernate加载它。 PaymentType是抽象的,因此无法实现。从这样的数据库加载实体时,Hibernate需要一个构造函数。所以你不能映射抽象类,你只能映射至少具有无参数构造函数的实现类。

=>在Order的映射中,您必须指定order.paymentTypeCreditCardPaymentType还是PaypalPaymentType。这解决了你的问题,因为你知道unknown到底是什么。

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

  1. 您使用两种方法boolean isCreditCardPayment()boolean isPaypalCardPayment()使PaymentType不是抽象的,而PaymentType包含数据库表的所有列。您只使用此课程而忘记了课程PaypalPaymentTypeCreditCardPaymentType
    1. PaypalPaymentTypeCreditCardPaymentType的映射中,您设置了where条件,确保仅加载正确付款类型的行。按顺序删除属性paymentType,作为替换,添加两个属性paypalPaymentType和creditcardPaymentType,它们引用两个Java类。加载Order时,两个属性中的一个将为null。为方便起见,您可以创建一个方法PaymentType getPaymentType(),它返回非空付款类型,但这种方法不能用于HQL查询。

答案 1 :(得分:1)

如果我错了,请纠正我。检查波纹管代码

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

根据url

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