Hibernate: tabla por clase concreta usando un archivo XML

Hibernate es capaz de 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 la relación «tiene un» 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 clase de hormigón (mapeo XML)

Table per Concrete Class es una de las estrategias de herencia en hibernate. Si queremos mantener cada objeto de herencia de clase concreta en tablas separadas de la base de datos, entonces podemos proceder con la tabla por estrategia de clase concreta.

En una tabla por estrategia de Clase Concreta:

  • Hibernate almacena cada objeto de clase derivado de la jerarquía en una tabla separada de la base de datos.
  • Para informar a Hibernate que aplica la tabla por asignación de herencia de clase concreta, necesitamos configurar la etiqueta <union-subclass> en la etiqueta <class> del archivo hbm.xml.
  • La columna del discriminador es opcional.

En esta estrategia, cada tabla de subclase tendrá los atributos específicos de la subclase y los atributos heredados de la clase principal.

Ejemplo de tabla por estrategia de clase concreta:

Supongamos que tenemos una clase Empleado con subclases como P_Employee y C_Employee. Siguiendo el diagrama de clases y relación de estas clases.

Jerarquía de clases

Jerarquía de clases

Tenemos 3 tablas Employee, P_Employee y C_Employee. El mapeo de la subclase repite las propiedades de la clase padre.

Creando una tabla de base de datos para persistir clases concretas:

CREAR TABLA `Empleado` (

        `Id` BIGINT(20) NO NULO AUTO_INCREMENTO,

       `nombre` VARCHAR(50) NO NULO PREDETERMINADO ‘0’,

       `edad` BIGINT(3) NO NULO PREDETERMINADO ‘0’,

        CLAVE PRINCIPAL (`id`)

)

CREAR TABLA `P_Empleado` (

       `Id` BIGINT(20) NO NULO AUTO_INCREMENTO,

      `nombre` VARCHAR(50) NO NULO PREDETERMINADO ‘0’,

      `edad` BIGINT(3) NO NULO PREDETERMINADO ‘0’,

     `salario` BIGINT(11) NULL DEFAULT NULL,

     CLAVE PRINCIPAL (`id`)

)

CREAR TABLA `C_Empleado` (

      `Id` BIGINT(20) NO NULO AUTO_INCREMENTO,

      `nombre` VARCHAR(50) NO NULO PREDETERMINADO ‘0’,

      `edad` BIGINT(3) NO NULO PREDETERMINADO ‘0’,

      `tarifahora` BIGINT(11) NULL DEFAULT NULL,

     `duración` BIGINT(11) NULO PREDETERMINADO NULO,

     CLAVE PRINCIPAL (`id`)

)

Estructura del proyecto (IntelliJ IDEA) para mapeo XML:

Estructura del proyecto

Estructura del proyecto

Creación de las clases Employee, P_Employee y C_Employee para la jerarquía anterior:

A continuación se muestra la implementación del archivo Employee.java .

Java

package com.exploit.model;
  
public class Employee {
    private int id;
    private String name;
    private int age;
  
    public int getId() { return id; }
  
    public void setId(int id) { this.id = id; }
  
    public String getName() { return name; }
  
    public void setName(String name) { this.name = name; }
  
    public int getAge() { return age; }
  
    public void setAge(String city) { this.age = age; }
}

A continuación se muestra la implementación del archivo P_Employee.java .

Java

package com.exploit.model;
  
public class P_Employee extends Employee {
    private double salary;
  
    public double getSalary() { return salary; }
  
    public void setSalary(double salary)
    {
        this.salary = salary;
    }
}

A continuación se muestra la implementación del archivo C_Employee.java .

Java

package com.exploit.model;
  
public class C_Employee extends Employee {
    private double hourlyRate;
    private double duration;
  
    public void setDuration(double duration)
    {
        this.duration = duration;
    }
  
    public double getDuration() { return duration; }
  
    public double getHourlyRate() { return hourlyRate; }
  
    public void setHourlyRate(double hourlyRate)
    {
        this.hourlyRate = hourlyRate;
    }
}

Creando el archivo de mapeo para la clase persistente:

A continuación se muestra la implementación del archivo employee.hbm.xml

XML

/*package whatever //do not write package name here */
  
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  
<hibernate-mapping package="com.exploit.model">
    <class name="Employee" table="Employee">
        <id name="id">
            <generator class="increment"></generator>
        </id>
        <property name="name" column="Name"></property>
        <property name="age" column="Age"></property>
  
        <union-subclass name="com.exploit.model.P_Employee" table="P_Employee">
            <property name="salary" column="Salary"></property>
        </union-subclass>
  
        <union-subclass name="com.exploit.model.C_Employee" table="C_Employee">
            <property name="hourlyRate" column="HourlyRate"></property>
            <property name="duration" column="Duration"></property>
        </union-subclass>
  
    </class>
  
</hibernate-mapping>

Agregando el mapeo del archivo hbm.xml en el archivo de configuración de hibernación:

A continuación se muestra la implementación del archivo hibernate.cfg.xml

XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
       "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
       "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
   
<hibernate-configuration>
   
   <session-factory>
   
       <!-- Database connection properties -->
       <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
       <property name="connection.url">jdbc:mysql://localhost/javainsimpleway</property>
       <property name="connection.username">root</property>
       <property name="connection.password">root</property>
   
       <!-- JDBC connection pool (using the built-in) -->
       <property name="connection.pool_size">1</property>
   
       <!-- SQL dialect -->
       <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
   
       <!-- Disable the second-level cache -->
       <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
   
       <!-- Echo all executed SQL to stdout -->
       <property name="show_sql">true</property>
         
       <!-- Format the generated Sql -->
       <property name="format_sql">true</property>
   
       <!-- Dont Drop and re-create the database schema on startup,Just update it -->
       <property name="hbm2ddl.auto">update</property>
   
       <mapping resource="com/exploit/mapping/employee.hbm.xml"/>
   
   </session-factory>
   
</hibernate-configuration>

Hemos definido solo un archivo de mapeo de hibernación (hbm) Employee.hbm.xml, las clases de modelo P_Employee y C_Employee están definidas dentro de un archivo hbm.xml . Mapeamos todas las clases usando una simple etiqueta <class> en hbm. Esta es la forma habitual de mapear Table Per Concrete Class usando XML .

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 *