sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-overerving met JPA, Hibernate

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.



  1. PostgreSQL-schema's / naamruimten met Django

  2. Eenvoudige CRUD-bewerking met PDO-databaseverbinding

  3. implementeer LIKE-query in PDO

  4. Foutcode:1215. Kan geen beperking voor externe sleutels toevoegen (buitenlandse sleutels)