0

HibernateでJPA2を使用しています。2つのエンティティクラス、CardElementおよびがありIdentityDocumentKindます。最後のものは最初のものの継承されたエンティティです。SINGLE_TABLE継承戦略が使用されます。クエリで親クラスのインスタンスを選択しようとするとfrom CardElement where id = '123456'、次のエラーが発生します。

ID:123456のオブジェクトは、指定されたサブクラスではありませんでした:org.cp.cardsystem.CardElement(識別子:SDocClass)

「SDocClass」ディスクリミネーター値のサブクラスがありません。実際、クラスの開発の時点で、のIdentityDocumentKindクエリはCardElementアプリケーション全体で広く使用されていました。したがって、各ディスクリミネーター値のサブクラスを作成して、既存のすべてのクエリでCardElement置き換えることはできません。CardElementそれは私にとってあまりにも多くの努力を要するでしょう。SINGLE_TABLE継承戦略が使用されている場合に親エンティティクラスをインスタンス化する方法はありますか?

4

2 に答える 2

1

私はあなたの問題を正しく理解しているかどうかわかりません。単一テーブル戦略を使用して、継承階層全体を格納しています。ただし、一部のディスクリミネーターのみをマップしました。今回は、マップされていないディスクリミネーターが問題を引き起こしています(Hibernateはそのサブクラスが何を意味するのかわからないため)。私はあなたの問題を正しく理解していますか?

実際のテーブルではなく、特別なDBビューに対して作業することを検討してください。そのビューは、処理できるディスクリミネーターを持つレコードのみを公開します。

于 2012-08-07T04:05:37.630 に答える
0

問題は解決しました。CardElement継承階層のルートエンティティクラス( )に次のように注釈を付けまし@DiscriminatorValue(value = "not null")た。これで、ディスクリミネーター値ごとにサブクラスを作成せずに、このクラスのオブジェクトを選択できます。not nullそして、nullそれぞれnullとnullを除くすべての識別子列で一致するHibernateの特別な識別子値のようです。これらの値に関する情報は、Hibernateの公式ドキュメントにはありません。したがって、それはある種の文書化されていない機能である可能性があります。

于 2012-08-07T15:27:15.680 に答える