sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL-arv med JPA, Hibernate

JPA's begreb om arv er baseret på almindelige tabeller. Det "får" ikke rigtig ideen om PostgreSQL's tabelarv. Det er en af ​​omkostningerne ved at arbejde med en spec designet til at afsløre den laveste fællesnævner af funktioner og gøre det bærbart.

Se denne guide for en anstændig oversigt over JPA-arvsstrategier. Bemærk, at i det nyere Java 6 JavaDoc for @Inheritance er der en note, der siger, at:

Hvis Arv-annotationen ikke er angivet, eller hvis der ikke er angivet nogen arvetype for et enhedsklassehierarki, bruges SINGLE_TABLEmapping-strategien.

... og hvis du ser på hvordan SINGLE_TABLE virker, det er ikke overraskende, at det ikke virker for dig; det forventer, at alle underklasser er i ét stort bord med en magisk diskriminatorværdi.

InheritanceType.TABLE_PER_CLASS er tættere på, hvordan Pg opfører sig, men jeg formoder, at JPA impl vil blive en smule forvirret, når basistypetabellerne har indgange for hver entitet af en bladtype. Den forsøger at gøre ting som UNION forespørgsler på tværs af underklassetabellerne, når der forespørges på superklassen, og det kan give ulige resultater - i det mindste duplikering, hvis UNION bruges og ydeevneproblemer, hvis den bruger UNION ALL . Afhængigt af præcis hvordan udbyderen implementerer strategien, kan det i det mindste delvist fungere. Du bliver nødt til at teste, og resultaterne vil muligvis være ret udbyderspecifikke.

En rigtig god implementering af PG-arvsunderstøttelse til JPA ville sandsynligvis kræve JPA-udbyderudvidelser til en ny arvestrategi, der forstod PostgreSQL-udvidelserne for arv og ONLY forespørgsler.

Hvis du kan overbevise din JPA-implementering om at bruge SELECT ... FROM ONLY subclass_table når i InheritanceType.TABLE_PER_CLASS tilstand, så skulle den fungere OK med PostgreSQL-arv. Det ville kun se de ikke-nedarvede rækker i hver tabel og arbejde med dem, som om de var almindelige tabeller. Din anden ikke-JPA-kode kan derefter blive ved med at bruge arvefunktionerne. Jeg gætter på, at det er muligt, at du kan ændre PostgreSQL-dialektkoden for Hibernate for at gøre dette, men personligt ville jeg ikke tage dertil, medmindre jeg absolut havde at få JPA til at understøtte eksisterende PostgreSQL-skema, der i høj grad var afhængig af arv.



  1. Hvordan undslipper jeg et reserveret ord i Oracle?

  2. mysql_fetch_row() vs mysql_fetch_assoc() vs mysql_fetch_array()

  3. Hvordan forskønner man det output, der kommer fra SELECT-forespørgslen i kommandoprompten?

  4. T-SQL tirsdag #67:Ny sikkerhedskopiering og gendannelse af udvidede begivenheder