【问题标题】:Hibernate HQL and inheritanceHibernate HQL 和继承
【发布时间】:2012-06-18 07:04:17
【问题描述】:

这是我的问题-

有两个类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

提前致谢。

【问题讨论】:

    标签: hibernate inheritance hql


    【解决方案1】:

    你想做的事无论如何都行不通。

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

    => 在Order 的映射中,您必须指定order.paymentTypeCreditCardPaymentType 还是PaypalPaymentType。这解决了你的问题,因为这样你就知道unknown 的真正含义了。

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

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

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

    【讨论】:

    • 感谢您的回答。对我来说很有意义:)
    【解决方案2】:

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

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

    根据url

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多