Hibernate: tabla por subclase usando anotación

Hibernate es un marco Java ORM (mapeo relacional de objetos) de código abierto, no invasivo y livianoque se utiliza para desarrollar una lógica de persistencia que es independiente del software de la base de datos. Un marco ORM (mapeo relacional de objetos) simplifica la creación de datos, la manipulación de datos y el acceso a datos. Es una técnica de programación que asigna el objeto a los datos almacenados en la base de datos. Utiliza internamente la API de JDBC para interactuar con la base de datos.

Herencia en Hibernate

Hibernate puede almacenar las propiedades heredadas de un objeto junto con sus nuevas propiedades en su base de datos cuando un objeto se guarda en la base de datos. En Hibernate , la herencia entre clases POJO se aplica cuando varias clases POJO de un módulo contienen algunas propiedades comunes. En una aplicación en tiempo real, las clases POJO de Hibernate se diseñan según el diseño de la tabla de la base de datos.

Si más de una clase POJO tiene algunas propiedades comunes, esas propiedades comunes se separan en una clase POJO llamada clase base y las propiedades que no son comunes se almacenan en la clase derivada. Este es el concepto del mecanismo de herencia de Hibernate . Hibernate es capaz de almacenar los datos de una jerarquía de clases de una aplicación en una tabla de la base de datos o en varias tablas de la base de datos según el diseño de la base de datos.

Mapeo de herencia de Hibernate

La orientación a objetos puede modelar las relaciones «es un» y «tiene un» . El modelo relacional solo admite «tiene una relación» entre dos entidades. Hibernate ayuda a mapear dichos objetos con tablas relacionales. Hay tres estrategias de mapeo de herencia definidas en Hibernate .

  • Tabla por jerarquía
  • Tabla por clase de hormigón
  • Tabla por subclase

Tabla por subclase

En una estrategia de tabla por subclase (Usando un archivo XML)

  1. Para cada clase de la jerarquía existe una tabla separada en la base de datos.
  2. Las tablas se crean de acuerdo con las clases persistentes, pero se tratan con claves primarias y externas para que no haya ninguna columna duplicada en la relación.
  3. Al crear la tabla de la base de datos, se requiere una relación de clave externa entre la tabla principal y la tabla secundaria.
  4. Para pasar información a Hibernate que aplica la tabla por mapeo de subclase, tenemos que configurar la etiqueta <joined-subclass> bajo la etiqueta <class> del archivo hbm.xml
  5. La columna discriminadora es opcional.

En una estrategia de tabla por subclase (usando anotaciones) 

  1. El discriminador es opcional, por lo que podemos evitar las anotaciones relacionadas con el discriminador.
  2. Necesitamos una tabla separada para la clase base y para cada clase derivada.
  3. Para obtener una relación entre la tabla de clases base y la tabla de clases derivadas, usamos una columna de clave externa en la tabla de clases derivadas
  4. La columna de clave externa en la tabla de clase derivada también se puede usar como columna de clave principal para esa tabla de clase derivada para informar a Hibernate que una columna de la tabla está actuando como clave principal y clave externa. Usamos la anotación @PrimaryKeyColumn para ese propósito.

Anotaciones importantes

Anotación 1: @Inheritance: esta anotación define la estrategia de herencia que se utilizará para una jerarquía de clase de entidad. Se especifica en la clase de entidad que es la raíz de la jerarquía de clases de entidad. Si no se especifica esta anotación o si no se especifica ningún tipo de herencia para una jerarquía de clase de entidad, se utiliza la estrategia de correlación SINGLE_TABLE .

Sintaxis: @Herencia

@Entity
@Table("name = students")
@Inheritance(strategy = InheritanceType.JOINED)

// Class 
public class Student {

    // Insert code here
}

Anotación 2: @PrimaryKeyJoinColumn

Esta anotación especifica una columna de clave principal que se utiliza como clave externa para unirse a otra tabla. Se utiliza para unir la tabla principal de una subclase de entidad en la estrategia de mapeo JOINED a la tabla principal de su superclase. Se usa dentro de una anotación de tabla secundaria para unir una tabla secundaria a una tabla principal y se puede usar en un mapeo uno a uno en el que la clave principal de la entidad de referencia se usa como clave externa para la entidad a la que se hace referencia. Si no se especifica PrimaryKeyJoinColumn para una subclase en la estrategia de asignación JOINED , se supone que la columna de clave externa tiene el mismo nombre que las columnas de clave principal de la tabla principal de la superclase.

Sintaxis: @PrimaryKeyJoinColumn

@Entity
@Table("name = students")
@PrimaryKeyJoinColumn (name = "sid")

// Class
public class Student {
    // Insert code here
}

Anotación 3: @InheritanceType

Esta anotación define las opciones de estrategia de herencia. JOINED es una estrategia en la que los campos que son específicos de una subclase se asignan a una tabla separada de los campos que son comunes a la clase principal, y se realiza una unión para instanciar la subclase .

Implementación: 

Tabla por clase de subclase usando Anotación donde En este ejemplo, crearemos tres clases de persistencia y proporcionaremos el mapeo de estas clases en el archivo student.hbm.xml.

Estaremos creando diferentes archivos que se enumeran a continuación: 

  1. Empleado.java
  2.  Una clase que se extiende por encima de la clase Employee.java 
  3. Archivo XML de dependencia
  4. Archivo XML de configuración

A: Clase de empleado 

Java

// Java Program to Illustrate Implementation of
// Employee Class
 
package com.exploit.org;
 
// Importing required classes
import javax.persistence.*;
 
// Annotations
@Entity
@Table(name = "employee")
@Inheritance(strategy = InheritanceType.JOINED)
 
// Class
public class Employee {
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
 
    @Column(name = "ID")
    private String id;
 
    @Column(name = "Name") private String name;
}

B: Archivo: R_Employee.java, que está implementando la clase anterior «Empleado»

Ejemplo:

Java

// Java Program to Illustrate Implementation of
// R_Employee Class
 
package com.exploit.org;
 
// Importing required classes
import javax.persistence.*;
 
// Annotations
@Entity
@Table(name = "r_employee")
@PrimaryKeyJoinColumn(name = "ID")
 
// Class
// Extending Employee class
public class R_Employee extends Employee {
 
    @Column(name = "salary") private double salary;
    @Column(name = "bonus") private double bonus;
}

C: Archivo: C_Employee.java, que está implementando la clase anterior «Empleado»

Java

// Java Program to Illustrate Implementation of
// C_Employee Class
 
package com.exploit.org;
 
// Importing required classes
import javax.persistence.*;
 
// Annotations
@Entity
@Table(name = "c_employee")
@PrimaryKeyJoinColumn(name = "ID")
 
// Class
// Extending Employee class
public class C_Employee extends Employee {
 
    @Column(name = "pay") private double pay;
    @Column(name = "contract") private String contract;
}

D: Archivo: pom.xml 

Ejemplo:

XML

<dependency> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-core</artifactId> 
       <version>5.3.1.Final</version> 
</dependency> 
 
<dependency> 
       <groupId>com.oracle</groupId> 
       <artifactId>ojdbc14</artifactId> 
      <version>10.2.0.4.0</version> 
 
</dependency>

Agregue las siguientes dependencias anteriores que se indican a continuación en el archivo pom.xml.

Más tarde, cree un archivo de configuración hibernate.cgf.xml y agregue las entradas de los recursos de mapeo.

Ejemplo:

XML

<mapping class="com.exploit.org.Employee"/> 
<mapping class="com.exploit.org.C_Employee"/> 
<mapping class="com.exploit.org.R_Employee"/>

Publicación traducida automáticamente

Artículo escrito por kaalel y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *