Koncept dědičnosti JPA je založen na běžných tabulkách. Opravdu to "nedostává" myšlenku dědičnosti tabulek PostgreSQL. To je jedna z nákladů na práci se specifikací navrženou tak, aby odhalila nejmenšího společného jmenovatele funkcí a byla přenosná.
Podívejte se na tuto příručku, kde najdete slušný souhrn strategií dědičnosti JPA. Všimněte si, že v novějším Java 6 JavaDoc pro @Inheritance je poznámka, která říká:
Není-li uvedena anotace dědičnosti nebo není-li pro hierarchii tříd entit zadán žádný typ dědičnosti, použije se strategie mapování SINGLE_TABLE.
... a když se podíváte, jak SINGLE_TABLE
funguje, není divu, že to nefunguje pro vás; očekává se, že všechny podtřídy budou v jedné velké tabulce s hodnotou magického diskriminátoru.
InheritanceType.TABLE_PER_CLASS
je blíže tomu, jak se chová Pg, ale mám podezření, že impl JPA bude trochu zmatený, když tabulky základních typů obsahují položky pro každou entitu typu list. Snaží se dělat věci jako UNION
dotazy napříč tabulkami podtříd při dotazování na nadtřídu, což by mohlo vést k lichým výsledkům – přinejmenším duplikaci, pokud UNION
a problémy s výkonem, pokud používá UNION ALL
. V závislosti na tom, jak přesně poskytovatel strategii implementuje, může alespoň částečně fungovat. Museli byste testovat a výsledky by mohly být dost specifické pro poskytovatele.
Opravdu dobrá implementace podpory dědičnosti PG pro JPA by pravděpodobně vyžadovala rozšíření poskytovatele JPA pro novou strategii dědičnosti, která by rozuměla rozšířením PostgreSQL pro dědění a pro ONLY
dotazy.
Pokud dokážete přesvědčit svou implementaci JPA, aby používala SELECT ... FROM ONLY subclass_table
v InheritanceType.TABLE_PER_CLASS
režimu, pak by měl správně spolupracovat s dědičností PostgreSQL. V každé tabulce by viděl pouze nezděděné řádky a pracoval by s nimi, jako by to byly běžné tabulky. Váš další kód, který není JPA, by pak mohl nadále používat funkce dědičnosti. Myslím, že je možné, že byste mohli upravit kód dialektu PostgreSQL pro Hibernate, abyste to udělali, ale osobně bych tam nešel, pokud bych to absolutně neměl aby JPA podporoval stávající schéma PostgreSQL, které se silně spoléhalo na dědičnost.