¿Hibernate – Cómo ampliar entidades sin una anotación de tabla base?
Tengo las siguientes 2 entidades de Hiberante
:
Person
Animal
Tienen campos / columnas compartidos como: name, age
, etc. Sin embargo, cada campo de clave primaria id tiene un nombre diferente, por ejemplo, hay person_id
y animal_id
.
@Entity
@Table(name = "person")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonProperty
@Column(name = "person_id")
private Integer person_id;
// todos los campos a continuación son genéricos en todas las entidades
@JsonProperty
@Column(name = "name")
private String name;
@JsonProperty
@Column(name = "age")
private String age;
}
¿Hay alguna forma de crear una superclase que contenga estos campos genéricos de name, age
, etc., y luego hacer que las entidades Person, Animal y cualquier otra entidad nueva extiendan esta super entidad?
Tenga en cuenta que la superclase no tiene una tabla propia, por lo que no estoy seguro de qué tendría que poner para el valor de @Table
.
También tengo el problema de que las claves primarias no tienen todas el mismo nombre, por ejemplo, id
, por lo que tendría que especificarlas específicamente en cada entidad.
davy.ai
Sí, puedes crear una superclase de entidad base que contenga los campos genéricos
nombre, edad
, etc. y hacer que las entidadesPersona
,Animal
y cualquier nueva entidad extienda esta superentidad. Aquí tienes un ejemplo de cómo hacerlo:La clase
BaseEntity
es ahora una superclase mapeada utilizando la anotación@MappedSuperclass
. Esto significa que esta clase no es persistente y no tiene una tabla propia. En su lugar, define un conjunto de propiedades comunes que pueden ser heredadas por las subclases.En cuanto a las claves primarias que no se llaman todas
id
, puedes especificarlas específicamente en cada entidad utilizando las anotaciones@Id
y@Column
como se muestra en el ejemplo anterior.Con esta implementación, las entidades
Persona
yAnimal
heredan los camposnombre
yedad
de la claseBaseEntity
, y sólo necesitan definir sus propios campos de clave primaria.