sql >> Base de Datos >  >> RDS >> PostgreSQL

Herencia PostgreSQL con JPA, Hibernate

El concepto de herencia de JPA se basa en tablas ordinarias. Realmente no "entiende" la idea de la herencia de tablas de PostgreSQL. Ese es uno de los costos de trabajar con una especificación diseñada para exponer el mínimo común denominador de funciones y hacerlo de forma portátil.

Consulte esta guía para obtener un resumen decente de las estrategias de herencia de JPA. Tenga en cuenta que en el JavaDoc Java 6 más nuevo para @Inheritance hay una nota que dice que:

Si no se especifica la anotación de herencia o si no se especifica ningún tipo de herencia para una jerarquía de clase de entidad, se utiliza la estrategia de mapeo SINGLE_TABLE.

... y si observas cómo SINGLE_TABLE funciona, no es de extrañar que no funcione para usted; espera que todas las subclases estén en una gran tabla con un valor de discriminador mágico.

InheritanceType.TABLE_PER_CLASS está más cerca de cómo se comporta Pg, pero sospecho que JPA impl se confundirá un poco cuando las tablas de tipo base tengan entradas para cada entidad de un tipo de hoja. Intenta hacer cosas como UNION consultas a través de las tablas de la subclase al consultar en la superclase, y eso podría producir resultados extraños, al menos duplicación si UNION se usa y problemas de rendimiento si usa UNION ALL . Dependiendo exactamente de cómo el proveedor implemente la estrategia, puede funcionar al menos parcialmente. Tendría que probar, y los resultados posiblemente serían bastante específicos del proveedor.

Una implementación realmente buena del soporte de herencia de PG para JPA probablemente requeriría extensiones de proveedor de JPA para una nueva estrategia de herencia que entendiera las extensiones de PostgreSQL para herencia y para ONLY consultas.

Si puede convencer a su implementación de JPA para que use SELECT ... FROM ONLY subclass_table cuando en InheritanceType.TABLE_PER_CLASS modo, entonces debería interoperar bien con la herencia de PostgreSQL. Vería solo las filas no heredadas en cada tabla y trabajaría con ellas como si fueran tablas ordinarias. Su otro código que no sea JPA podría seguir usando las funciones de herencia. Supongo que es posible que pueda modificar el código del dialecto de PostgreSQL para Hibernate para hacer esto, pero personalmente no iría allí a menos que absolutamente tenía para hacer que JPA admita el esquema PostgreSQL existente que dependía en gran medida de la herencia.