strategy single_table single per joined inheritancetype java hibernate jpa annotations

java - single_table - mappedsuperclass jpa



Clase abstracta heredada con JPA(+ Hibernate) (3)

¿Cómo configuraría las anotaciones en el siguiente código de ejemplo? Me gustaría seguir con las anotaciones de JPA y evitar las dependencias específicas de Hibernate. Es correcto el siguiente código?

@Entity public class RefExample extends RefData { }

(Habrá múltiples versiones de estas clases, RefSomeOtherExample, etc. y una tabla db por clase. Algunas pueden agregar campos adicionales (columnas) pero la mayoría simplemente utilizará los campos básicos heredados de la clase base "RefData").

Clase base:

@Entity public abstract class RefData { private long id; private String code; private String desc; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(unique = true, nullable = false) public long getId() { return id; } public void setId(long id) { this.id = id; } @Column(unique = true, nullable = false, length=8) public String getCode() { return code; } public void setCode(String code) { this.code = code; } @Column(unique = true, nullable = false, length=80) public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }

En última instancia, me gustaría generar scripts de creación de esquema a partir de esta utilizando la clase SchemaExport de Hibernate. En el caso anterior, estas dos clases solo deberían dar como resultado la creación de una única tabla llamada "RefExample" con las tres columnas de "RefData". esto funcionara?


De la especificación JPA 1.0:

Tanto las clases abstractas como las concretas pueden ser entidades. Tanto las clases abstractas como las concretas se pueden anotar con la anotación de entidad , correlacionarse como entidades y buscarse como entidades.

Las entidades pueden extender clases que no sean de entidad y las clases que no son de entidad pueden extender clases de entidad .

Como desea una sola tabla, debe usar la herencia de Tabla única .

Solo defina una columna de discriminación de la siguiente manera:

@Entity @DiscriminatorColumn(name="REF_TYPE") public abstract class RefData {

Pero si no quiere confiar en las estrategias de herencia JPA, puede usar MappedSuperclass en su lugar:

@MappedSuperclass public abstract class RefData {

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 .

Tenga en cuenta que no puede usar @Entity y @MappedSuperclass al mismo tiempo.


Puede usar una de las estrategias de herencia para esto. Su caso parece ser el caso de una sola clase para la jerarquía.

Verifique this


@MappedSuperClass se trabajó para mí. Estaba luchando por asignar una vista a 2 objetos que son clases principales y secundarias. Mi vista está unida desde 2 tablas. Las claves primarias de ambas tablas están presentes en la vista. @DiscriminatorColumn no me funciona porque requiere una columna asignada exclusivamente al tipo de datos del objeto y también arroja ''repeated Column in object exception'' que no pude resolver.

Leí este foro y probé la anotación de @MappedSuperClass . Lo hace el truco.

Puse @MappedSuperClass en la superclase y puse @Id y @GeneratedValue en el identificador de superclase. En la subclase que he dado como

@Entity @Table(name="view_name")

y usó un objeto de clase secundaria para obtener los datos de la vista. Eso es.

La herencia en las anotaciones de hibernación para la tabla Unida sin usar @DiscriminatorColumn funcionó para mí.

Gracias.