PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Vererbung mit JPA, Hibernate

Das Vererbungskonzept von JPA basiert auf gewöhnlichen Tabellen. Es "versteht" nicht wirklich die Idee der Tabellenvererbung von PostgreSQL. Das ist einer der Kosten für die Arbeit mit einer Spezifikation, die darauf ausgelegt ist, den kleinsten gemeinsamen Nenner von Funktionen offenzulegen und dies portabel zu tun.

In diesem Leitfaden finden Sie eine anständige Zusammenfassung der JPA-Vererbungsstrategien. Beachten Sie, dass es im neueren Java 6 JavaDoc für @Inheritance einen Hinweis gibt, der besagt:

Wenn die Vererbungsannotation nicht angegeben ist oder wenn kein Vererbungstyp für eine Entitätsklassenhierarchie angegeben ist, wird die Zuordnungsstrategie SINGLE_TABLE verwendet.

... und wenn Sie sich ansehen, wie SINGLE_TABLE funktioniert, ist es nicht verwunderlich, dass es bei Ihnen nicht funktioniert; es erwartet, dass sich alle Unterklassen in einer großen Tabelle mit einem magischen Diskriminatorwert befinden.

InheritanceType.TABLE_PER_CLASS ist näher am Verhalten von Pg, aber ich vermute, dass das JPA-impl etwas verwirrt wird, wenn die Basistyptabellen Einträge für jede Entität eines Blatttyps enthalten. Es versucht Dinge wie UNION zu tun Abfragen über die Unterklassentabellen hinweg, wenn die Oberklasse abgefragt wird, und das könnte zu seltsamen Ergebnissen führen - zumindest zu einer Duplizierung, wenn UNION verwendet wird und Leistungsprobleme auftreten, wenn UNION ALL verwendet wird . Je nachdem, wie genau der Anbieter die Strategie umsetzt, kann es zumindest teilweise funktionieren. Sie müssten testen, und die Ergebnisse wären möglicherweise ziemlich anbieterspezifisch.

Eine wirklich gute Implementierung der PG-Vererbungsunterstützung für JPA würde wahrscheinlich JPA-Anbietererweiterungen für eine neue Vererbungsstrategie erfordern, die die PostgreSQL-Erweiterungen für die Vererbung und für ONLY versteht Abfragen.

Wenn Sie Ihre JPA-Implementierung davon überzeugen können, SELECT ... FROM ONLY subclass_table zu verwenden wenn in InheritanceType.TABLE_PER_CLASS Modus, dann sollte es mit der PostgreSQL-Vererbung zusammenarbeiten. Es würde nur die nicht geerbten Zeilen in jeder Tabelle sehen und mit ihnen arbeiten, als wären es gewöhnliche Tabellen. Ihr anderer Nicht-JPA-Code könnte dann weiterhin die Vererbungsfunktionen verwenden. Ich denke, es ist möglich, den PostgreSQL-Dialektcode für Hibernate zu ändern, um dies zu tun, aber ich persönlich würde nicht dorthin gehen, es sei denn, ich hätte es unbedingt getan damit JPA das vorhandene PostgreSQL-Schema unterstützt, das stark auf Vererbung angewiesen ist.