Концепцията на JPA за наследяване се основава на обикновени таблици. Това всъщност не "разбира" идеята за наследяването на таблиците на PostgreSQL. Това е една от разходите за работа със спецификация, предназначена да разкрие най-ниския общ знаменател на функции и да го направи преносимо.
Вижте това ръководство за прилично обобщение на стратегиите за наследяване на JPA. Имайте предвид, че в по-новата Java 6 JavaDoc за @Inheritance има бележка, която казва, че:
Ако анотацията Inheritance не е посочена или ако не е посочен тип наследяване за йерархия на клас на обект, се използва стратегията SINGLE_TABLEmapping.
... и ако погледнете как SINGLE_TABLE
работи, не е изненадващо, че не работи за вас; очаква всички подкласове да бъдат в една голяма таблица със стойност на магически дискриминатор.
InheritanceType.TABLE_PER_CLASS
е по-близо до това как се държи Pg, но подозирам, че JPA impl ще се обърка малко, когато таблиците с базов тип имат записи за всеки обект от листов тип. Опитва се да прави неща като UNION
заявки в таблиците на подкласовете при запитване в суперкласа и това може да доведе до странни резултати - поне дублиране, ако UNION
се използва и проблеми с производителността, ако използва UNION ALL
. В зависимост от това как точно доставчикът прилага стратегията, тя може да работи поне частично. Ще трябва да тествате и резултатите вероятно ще бъдат доста специфични за доставчика.
Една наистина добра реализация на поддръжка на PG наследяване за JPA вероятно ще изисква разширения на доставчик на JPA за нова стратегия за наследяване, която разбира разширенията на PostgreSQL за наследяване и за ONLY
запитвания.
Ако можете да убедите внедряването си на JPA да използва SELECT ... FROM ONLY subclass_table
когато е в InheritanceType.TABLE_PER_CLASS
режим, тогава той трябва да работи ОК с наследяването на PostgreSQL. Ще вижда само ненаследените редове във всяка таблица и ще работи с тях, сякаш са обикновени таблици. Другият ви код, който не е JPA, може да продължи да използва функциите за наследяване. Предполагам, че е възможно да промените диалектния код на PostgreSQL за Hibernate, за да направите това, но лично аз не бих отишъл там, освен ако не имах да накара JPA да поддържа съществуваща PostgreSQL схема, която разчита в голяма степен на наследяване.