JPA's concept van overerving is gebaseerd op gewone tabellen. Het "snapt" niet echt het idee van de tabelovererving van PostgreSQL. Dat is een van de kosten van het werken met een specificatie die is ontworpen om de kleinste gemene deler van functies bloot te leggen en dit draagbaar te doen.
Zie deze gids voor een degelijke samenvatting van JPA-overervingsstrategieën. Merk op dat er in de nieuwere Java 6 JavaDoc voor @Inheritance een opmerking staat dat:
Als de overerving-annotatie niet is opgegeven of als er geen overervingstype is opgegeven voor een entiteitsklassehiërarchie, wordt de SINGLE_TABLE-toewijzingsstrategie gebruikt.
... en als je kijkt naar hoe SINGLE_TABLE
werkt, is het niet verwonderlijk dat het voor jou niet werkt; het verwacht dat alle subklassen in één grote tabel staan met een magische discriminatorwaarde.
InheritanceType.TABLE_PER_CLASS
ligt dichter bij hoe Pg zich gedraagt, maar ik vermoed dat de JPA-impl een beetje in de war zal raken wanneer de tabellen van het basistype vermeldingen hebben voor elke entiteit van een bladtype. Het probeert dingen te doen zoals UNION
query's in de subklassetabellen bij het uitvoeren van query's op de superklasse, en dat zou vreemde resultaten kunnen opleveren - in ieder geval duplicatie als UNION
wordt gebruikt en prestatieproblemen als het UNION ALL
. gebruikt . Afhankelijk van hoe de provider de strategie precies implementeert, kan deze op zijn minst gedeeltelijk werken. Je zou moeten testen en de resultaten zouden mogelijk redelijk providerspecifiek zijn.
Een echt goede implementatie van PG-overervingsondersteuning voor JPA zou waarschijnlijk JPA-providerextensies vereisen voor een nieuwe overervingsstrategie die de PostgreSQL-extensies voor overerving begreep en voor ONLY
vragen.
Als u uw JPA-implementatie kunt overtuigen om SELECT ... FROM ONLY subclass_table
wanneer in InheritanceType.TABLE_PER_CLASS
modus, dan zou het goed moeten samenwerken met PostgreSQL-overerving. Het zou alleen de niet-overgeërfde rijen in elke tabel zien en ermee werken alsof het gewone tabellen zijn. Uw andere niet-JPA-code kan dan de overervingsfuncties blijven gebruiken. Ik denk dat het mogelijk is dat je de PostgreSQL-dialectcode voor Hibernate kunt wijzigen om dit te doen, maar persoonlijk zou ik daar niet heen gaan tenzij ik absoluut had om JPA het bestaande PostgreSQL-schema te laten ondersteunen dat sterk afhankelijk was van overerving.