inheritance - per - Mejores prácticas para JPA polimórficas a través de anotaciones
mappedsuperclass jpa (1)
Estoy tratando de configurar el comportamiento polimórfico usando Hibernate con anotaciones JPA.
Parece sensato (incluso necesario) crear una clase (abstracta) que encapsule el estado y los comportamientos necesarios para que la jerarquía de herencia participe en la persistencia; por ejemplo
- Necesito anotar una propiedad Id, que no puedo hacer en una interfaz sin hacer que el campo sea público, para evitar una excepción ''No identificador especificado en la entidad'' en la superclase
- Necesito subclases para proporcionar un DiscriminatorValue si utilizo el enfoque de tabla por jerarquía de clases
¿Heredar de una clase abstracta junto con la persistencia de esta manera una práctica buena o mala? ¿Cuáles son los pros / contras? ¿Existen mejores prácticas para manejar la herencia en JPA?
No estoy seguro de que haya una respuesta absoluta a sus preguntas, realmente depende de su situación particular y de lo que quiere representar desde el punto de vista OO. Proporcionar algún ejemplo probablemente sea útil.
Pero sospecho que es posible que desee leer sobre las Superclases mapeadas . Aquí hay un pequeño extracto de la especificación JPA:
Una entidad puede heredar de una superclase que proporciona información persistente de estado y mapeo de la entidad, pero que no es en sí misma una entidad. Típicamente, el propósito de dicha superclase mapeada es definir información de estado y mapeo que es común a múltiples clases de entidad.
Una superclase mapeada, a diferencia de una entidad, no se puede consultar y no se puede pasar como un argumento a
EntityManager
o operaciones deQuery
. Una superclase mapeada no puede ser el objetivo de una relación persistente.Tanto las clases abstractas como las concretas pueden especificarse como superclases mapeadas. La anotación
MappedSuperclass
(o elemento de descriptor XML demapped-superclass
) se usa para designar una superclase mapeada.Una clase designada como
MappedSuperclass
no tiene una tabla separada definida para ella. Su información de mapeo se aplica a las entidades que heredan de ella.
Y creo que también debería leer sobre las diversas estrategias de herencia para representar la herencia a nivel de base de datos (tabla única por jerarquía de clases, tabla por clase concreta, subclase unida) respaldada por JPA ya que no proporcionan el mismo nivel de soporte para consultas polimórficas. La especificación JPA lo cubre decentemente.
Debajo de referencias relevantes.
Referencias
- Especificación JPA 1.0
- 2.1.9 Herencia
- 2.1.10 Estrategias de mapeo de herencia
- Guía de referencia de anotaciones de Hibernate