这是我的问题 -
有两个类Order
和PaymentType
。订单将有一个PaymentType
。现在PaymentType
是一个抽象类,还有另外两个名为CreditCardPaymentType
和PaypalPaymentType
的类,它们扩展了PaymentType
类。在休眠中,它们被建模为Single_Table策略。 CreditCardPaymentType
包含一个名为CreditCardNumber
的字段。我正在编写HQL,我的目的是急切地加载CreditCardNumber
实体。
session.createQuery("select order from Order as order " +
"inner join fetch order.paymentType.Unknown");
应该取代什么“未知”?由于PaymentType
类对CrediCardNumber
类一无所知,因此我可以在上述查询中加入CreditCardNumber
。
提前致谢。
答案 0 :(得分:2)
无论如何,你想做什么都不行。
按顺序,你不能创建一个PaymentType类型的实体,并用hibernate加载它。 PaymentType是抽象的,因此无法实现。从这样的数据库加载实体时,Hibernate需要一个构造函数。所以你不能映射抽象类,你只能映射至少具有无参数构造函数的实现类。
=>在Order
的映射中,您必须指定order.paymentType
是CreditCardPaymentType
还是PaypalPaymentType
。这解决了你的问题,因为你知道unknown
到底是什么。
解决您的任务:在数据库端,您可以在一个表中继续使用所有付款类型。在Java方面,你有两种可能性(两者都是一个想法):
boolean isCreditCardPayment()
和boolean isPaypalCardPayment()
使PaymentType不是抽象的,而PaymentType包含数据库表的所有列。您只使用此课程而忘记了课程PaypalPaymentType
和CreditCardPaymentType
。或
PaypalPaymentType
和CreditCardPaymentType
的映射中,您设置了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