java hibernate jpa inheritance orm

java - JPA: Implementación de la jerarquía del modelo-@MappedSuperclass vs. @ Herald



hibernate inheritance (2)

Como expliqué en este artículo , @MappedSupperclass es diferente de la anotación @Inheritance .

@MappedSuperclass le dice al proveedor de JPA que incluya las propiedades persistentes de la clase base como si hubieran sido declaradas por la clase hija extendiendo la superclase anotada con @MappedSuperclass .

Sin embargo, la herencia solo es visible en el mundo OOP, ya que, desde una perspectiva de base de datos, no hay indicación de la clase base. Solo la entidad de clase hija tendrá una tabla asignada asociada.

La anotación @Inheritance está destinada a materializar el modelo de herencia de OOP en la estructura de la tabla de la base de datos. @Inheritance , puede consultar una clase base anotada con @Inheritance pero no puede hacer eso para una clase base anotada con @MappedSuperclass .

Ahora, la razón por la que desea utilizar la anotación @Inheritance JPA es implementar patrones basados ​​en el comportamiento como el Patrón de estrategia .

Por otro lado, @MappedSuperclass es solo una forma de reutilizar propiedades básicas, asociaciones e incluso la entidad @Id utilizando una clase base común. Sin embargo, puede lograr casi el mismo objetivo utilizando un tipo @Embeddable . La única diferencia importante es que no puede reutilizar una definición de @Embeddable con @Embeddable , pero puede hacerlo con @MappedSuperclass .

Estoy usando Play Framework 1.2.4 con PostgreSQL y JPA . Me gustaría tener una jerarquía de modelos y ver que hay algunas alternativas para hacer esto.

Tengo una clase base (que es abstracta) y dos clases concretas que amplían esta clase base. No quiero persistir en esta clase base mientras quiero tener clases concretas. En la clase base, tengo otras clases de modelos como propiedades, en otras palabras, tengo relaciones @ManyToOne en mi clase base.

Mi pregunta es ¿cuál es la mejor forma de implementar esto? ¿ @MappedSuperclass o @Inheritance con la estrategia TABLE_PER_CLASS ? Estoy un poco confundido ya que parecen virtualmente equivalentes.

También me preocupan algunas cuestiones de consulta y rendimiento que podría enfrentar en el futuro.


MappedSuperClass se debe usar para heredar propiedades, asociaciones y métodos.

La herencia de la entidad se debe usar cuando se tiene una entidad y varias subentidades.

Puede decir si necesita uno u otro respondiendo estas preguntas: ¿hay alguna otra entidad en el modelo que pueda tener una asociación con la clase base?

Si es así, entonces la clase base es de hecho una entidad, y usted debe usar la herencia de la entidad. Si no, entonces la clase base es de hecho una clase que contiene atributos y métodos que son comunes a varias entidades no relacionadas, y usted debe usar una superclase mapeada.

Por ejemplo:

  • Puede tener varios tipos de mensajes: mensajes SMS, correos electrónicos o mensajes telefónicos. Y una persona tiene una lista de mensajes. También puede tener un recordatorio vinculado a un mensaje, independientemente del tipo de mensaje. En este caso, Message es claramente una entidad, y la herencia de la entidad debe ser utilizada.
  • Todos sus objetos de dominio podrían tener una fecha de creación, una fecha de modificación y una ID, por lo que podrían hacer que hereden de una clase base de AbstractDomainObject. Pero ninguna entidad tendrá una asociación con un AbstractDomainObject. Siempre será una asociación a una entidad más específica: Cliente, Empresa, lo que sea. En este caso, tiene sentido usar MappedSuperClass.