1

これが私の質問です-

2つのクラスOrderとがありPaymentTypeます。注文には1つありPaymentTypeます。現在は抽象クラスであり、クラスを拡張するとPaymentType呼ばれる他の2つのクラスがあります。休止状態では、これらはSingle_Table戦略としてモデル化されます。と呼ばれるフィールドが含まれています。私はHQLに従って書いていますが、私の意図はエンティティを熱心にロードすることです。CreditCardPaymentTypePaypalPaymentTypePaymentTypeCreditCardPaymentTypeCreditCardNumberCreditCardNumber

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

「不明」の代わりに何をすべきですか?PaymentTypeクラスはクラスについて何も知らないのでCrediCardNumber、熱心にロードするために上記のクエリに何を入れることができますかCreditCardNumber

前もって感謝します。

4

2 に答える 2

2

あなたがやりたいことはとにかくうまくいきません。

Orderでは、PaymentTypeタイプのエンティティを作成して、休止状態でロードすることはできません。PaymentTypeは抽象的であるため、インスタンス化することはできません。soデータベースからエンティティをロードする場合、Hibernateにはコンストラクターが必要です。したがって、抽象クラスをマップすることはできません。少なくともパラメーターのないコンストラクターを持つ実装クラスのみをマップできます。

=>のマッピングでは、 isまたは。Orderを指定する必要があります。そしてそれはあなたの問題を解決します、なぜならあなたはそれが本当に何であるかを知っているからです。order.paymentTypeCreditCardPaymentTypePaypalPaymentTypeunknown

タスクを解決するには:データベース側では、1つのテーブルですべての支払いタイプを続行できます。Java側では、2つの可能性があります(どちらもアイデアとしての意味があります)。

  1. 2つのメソッドboolean isCreditCardPayment()とを使用してPaymentTypeを抽象化せずboolean isPaypalCardPayment()、PaymentTypeにはデータベーステーブルのすべての列が含まれます。このクラスのみを使用し、クラスとを忘れPaypalPaymentTypeますCreditCardPaymentType

また

  1. PaypalPaymentType両方のマッピングでCreditCardPaymentType、正しい支払いタイプの行のみがロードされるようにするwhere条件を設定します。Orderで、プロパティpaymentTypeを削除し、代わりに、2つのJavaクラスを参照する2つのプロパティpaypalPaymentTypeとcreditcardPaymentTypeを追加します。をロードするOrderと、2つのプロパティのいずれかがnullになります。便宜上PaymentType getPaymentType()、null以外の支払いタイプを返すメソッドを作成できますが、この便利なメソッドはHQLクエリでは使用できません。
于 2012-06-15T08:50:28.350 に答える
2

私が間違っている場合は訂正してください。以下のコードを確認してください

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

URLに従って、

特別なプロパティクラスは、ポリモーフィックな永続性の場合、インスタンスのディスクリミネーター値にアクセスします。where句に埋め込まれたJavaクラス名は、その識別子の値に変換されます。猫猫からcat.class = DomesticCat

于 2012-07-17T12:25:56.177 に答える