Koncepcja dziedziczenia JPA opiera się na zwykłych tabelach. Tak naprawdę nie „łapie” idei dziedziczenia tabel PostgreSQL. To jeden z kosztów pracy ze specyfikacją zaprojektowaną w celu ujawnienia najniższego wspólnego mianownika funkcji i robienia tego w sposób przenośny.
Zobacz ten przewodnik, aby uzyskać przyzwoite podsumowanie strategii dziedziczenia JPA. Zwróć uwagę, że w nowszej wersji Java 6 JavaDoc for @Inheritance znajduje się informacja, że:
Jeśli nie określono adnotacji Dziedziczenie lub jeśli nie określono typu dziedziczenia dla hierarchii klas encji, używana jest strategia mapowania SINGLE_TABLE.
... a jeśli spojrzysz, jak SINGLE_TABLE
działa, nic dziwnego, że nie działa dla ciebie; oczekuje, że wszystkie podklasy będą znajdować się w jednej dużej tabeli z wartością magicznego rozróżniacza.
InheritanceType.TABLE_PER_CLASS
jest bliższy temu, jak zachowuje się Pg, ale podejrzewam, że impl JPA będzie nieco zdezorientowany, gdy tabele typu podstawowego mają wpisy dla każdej jednostki typu liścia. Próbuje robić takie rzeczy jak UNION
zapytania w tabelach podklas podczas zapytań w superklasie, co może dawać dziwne wyniki - przynajmniej powielanie, jeśli UNION
jest używany i ma problemy z wydajnością, jeśli używa UNION ALL
. W zależności od tego, jak dostawca realizuje strategię, może to działać przynajmniej częściowo. Musisz przetestować, a wyniki prawdopodobnie będą dość specyficzne dla dostawcy.
Naprawdę dobra implementacja obsługi dziedziczenia PG dla JPA prawdopodobnie wymagałaby rozszerzeń dostawcy JPA dla nowej strategii dziedziczenia, która rozumie rozszerzenia PostgreSQL dla dziedziczenia i dla ONLY
zapytania.
Jeśli możesz przekonać swoją implementację JPA do użycia SELECT ... FROM ONLY subclass_table
gdy w InheritanceType.TABLE_PER_CLASS
tryb to powinien współpracować OK z dziedziczeniem PostgreSQL. Zobaczyłby tylko niedziedziczone wiersze w każdej tabeli i pracowałby z nimi tak, jakby były zwykłymi tabelami. Twój inny kod inny niż JPA może wtedy nadal korzystać z funkcji dziedziczenia. Myślę, że możliwe jest zmodyfikowanie kodu dialektu PostgreSQL dla Hibernate, ale osobiście nie poszedłbym tam, chyba że absolutnie miałem aby JPA obsługiwał istniejący schemat PostgreSQL, który w dużej mierze opiera się na dziedziczeniu.