PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Herança do PostgreSQL com JPA, Hibernate


O conceito de herança do JPA é baseado em tabelas comuns. Ele realmente não "pega" a ideia da herança de tabelas do PostgreSQL. Esse é um dos custos de trabalhar com uma especificação projetada para expor o menor denominador comum de recursos e fazê-lo de forma portátil.

Consulte este guia para obter um resumo decente das estratégias de herança JPA. Observe que no Java 6 JavaDoc mais recente para @Inheritance há uma nota dizendo que:

Se a anotação de herança não for especificada ou se nenhum tipo de herança for especificado para uma hierarquia de classe de entidade, a estratégia de mapeamento SINGLE_TABLE será usada.

... e se você observar como SINGLE_TABLE funciona, não é surpresa que não funcione para você; ele espera que todas as subclasses estejam em uma grande tabela com um valor discriminador mágico.

InheritanceType.TABLE_PER_CLASS está mais próximo de como Pg se comporta, mas suspeito que o JPA impl ficará um pouco confuso quando as tabelas do tipo base tiverem entradas para cada entidade de um tipo folha. Ele tenta fazer coisas como UNION consultas nas tabelas de subclasses ao consultar a superclasse, e isso pode produzir resultados estranhos - pelo menos duplicação se UNION é usado e problemas de desempenho se usa UNION ALL . Dependendo de exatamente como o provedor implementa a estratégia, ela pode funcionar pelo menos parcialmente. Você teria que testar, e os resultados possivelmente seriam bastante específicos do provedor.

Uma implementação realmente boa de suporte a herança PG para JPA provavelmente exigiria extensões de provedor JPA para uma nova estratégia de herança que entendesse as extensões do PostgreSQL para herança e para ONLY consultas.

Se você conseguir convencer sua implementação JPA a usar SELECT ... FROM ONLY subclass_table quando em InheritanceType.TABLE_PER_CLASS mode, então ele deve interoperar bem com a herança do PostgreSQL. Ele veria apenas as linhas não herdadas em cada tabela e trabalharia com elas como se fossem tabelas comuns. Seu outro código não JPA poderia continuar usando os recursos de herança. Eu acho que é possível que você possa modificar o código de dialeto do PostgreSQL para o Hibernate fazer isso, mas pessoalmente eu não iria lá a menos que eu absolutamente tivesse para fazer o JPA suportar o esquema PostgreSQL existente que dependia muito da herança.