es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes crear una superclase de entidad base que contenga los campos genéricos nombre, edad, etc. y hacer que las entidades Persona, Animal y cualquier nueva entidad extienda esta superentidad. Aquí tienes un ejemplo de cómo hacerlo:

    @MappedSuperclass
    public class BaseEntity {
    
        @JsonProperty
        @Column(name = "nombre")
        private String nombre;
    
        @JsonProperty
        @Column(name = "edad")
        private String edad;
    
        // getters y setters
    
    }
    
    @Entity
    @Table(name = "persona")
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Persona extends BaseEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id_persona")
        private Integer idPersona;
    
        // getters y setters
    
    }
    
    @Entity
    @Table(name = "animal")
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Animal extends BaseEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id_animal")
        private Integer idAnimal;
    
        // getters y setters
    
    }
    

    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 y Animal heredan los campos nombre y edad de la clase BaseEntity, y sólo necesitan definir sus propios campos de clave primaria.

Comments are closed.