PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dziedziczenie PostgreSQL z JPA, Hibernate

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak włączyć TimescaleDB w istniejącej bazie danych PostgreSQL

  2. Zapytanie do ORDER BY liczba wierszy zwróconych z innego SELECT

  3. Przechowywanie json, jsonb, hstore, xml, enum, ipaddr itp. kończy się niepowodzeniem, ponieważ kolumna x jest typu json, ale wyrażenie ma charakter zmienny

  4. Transakcja autonomiczna w PostgreSQL 9.1

  5. Wyrażenie regularne w klauzuli PostgreSQL LIKE