JPAの継承の概念は、通常のテーブルに基づいています。 PostgreSQLのテーブル継承の概念を実際に「取得」するわけではありません。これは、機能の最小公分母を公開し、移植可能に公開するように設計された仕様を使用する場合のコストの1つです。
JPA継承戦略の適切な要約については、このガイドを参照してください。 @Inheritance用の新しいJava6JavaDocには、次のような注記があることに注意してください。
継承アノテーションが指定されていない場合、またはエンティティクラス階層に継承タイプが指定されていない場合は、SINGLE_TABLEmapping戦略が使用されます。
...そしてSINGLE_TABLE
動作しますが、動作しないのは当然です。すべてのサブクラスが魔法の弁別値を持つ1つの大きなテーブルにあることを期待しています。
InheritanceType.TABLE_PER_CLASS
はPgの動作に近いですが、基本タイプのテーブルにリーフタイプの各エンティティのエントリがある場合、JPAimplは少し混乱する可能性があります。 UNION
のようなことをしようとします スーパークラスでクエリを実行するときにサブクラステーブル全体でクエリを実行すると、奇妙な結果が生じる可能性があります。少なくともUNION
の場合は重複します。 UNION ALL
を使用すると、が使用され、パフォーマンスの問題が発生します 。プロバイダーが戦略をどのように実装するかに応じて、少なくとも部分的に機能する可能性があります。テストする必要があり、結果はプロバイダー固有のものになる可能性があります。
JPAのPG継承サポートの本当に優れた実装には、継承とONLY
のPostgreSQL拡張機能を理解した新しい継承戦略のために、おそらくJPAプロバイダー拡張機能が必要になります。 クエリ。
JPA実装にSELECT ... FROM ONLY subclass_table
を使用するように説得できる場合 InheritanceType.TABLE_PER_CLASS
にある場合 モードの場合は、PostgreSQLの継承と相互運用できます。各テーブルの継承されていない行のみが表示され、通常のテーブルであるかのように処理されます。その後、他の非JPAコードは、継承機能を引き続き使用できます。 HibernateのPostgreSQL方言コードを変更してこれを行うことは可能だと思いますが、個人的には、絶対に しなければ、そこには行きません。 JPAが継承に大きく依存する既存のPostgreSQLスキーマをサポートするようにするため。