PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL наследяване с JPA, хибернация

Концепцията на 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 схема, която разчита в голяма степен на наследяване.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да стигнем до края на деня?

  2. Темпорален дизайн на база данни, с обрат (на живо срещу чернови редове)

  3. PostgreSQL функция за последно въведен ID

  4. PostgreSQL IN оператор с слаба производителност на подзаявката

  5. postgresql последователност nextval в схемата