5.1 Descripción

Y finalmente, la última estrategia es Tabla por clase. Significa que se usará una tabla separada para cada clase. En cierto sentido, esta es la misma MappedSuperClass, solo que en una forma actualizada.

Primero, necesitas usar una anotación:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Las clases con esta anotación se verán así:


@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Entity
class User {
	int id;
	String name;
	LocalDate birthday;
}

@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}

@Entity
class Client extends User {
	String address;
}

Y tablas separadas para cada clase. Por ejemplo, estos:


CREATE TABLE user {
	id INT,
	name VARCHAR,
	birthday DATE
}

CREATE TABLE employee {
	id INT,
	name VARCHAR,
	birthday DATE,
	occupation VARCHAR,
	salary INT,
	join DATE
}

CREATE TABLE client {
	id INT,
	name VARCHAR,
	birthday DATE,
	address VARCHAR
}

La principal diferencia es que se utiliza una identificación de transferencia (CLAVE PRIMARIA) para todas las tablas. No puede tener diferentes filas con la misma identificación, no solo dentro de la misma tabla, sino también dentro de este grupo de tablas. Hibernate se encargará de esto.

5.2 Ejemplos

Es muy interesante ver cómo funciona todo.

Puede escribir una consulta HQL simple para obtener todos los usuarios: Usuario, Empleado, Cliente :

List<User> accounts = session.createQuery("from User").list();

Pero Hibernate, a su vez, generará una consulta muy interesante. Hará una selección de todas las mesas, luego la combinará a través de UNION ALL en una especie de mesa virtual, y solo entonces buscará y/o seleccionará

Pero para fusionar tablas con diferentes columnas, primero deben complementarse con columnas falsas. Por ejemplo, la tabla de usuarios debe complementarse con columnas:

  • occupation VARCHAR
  • salary INT
  • join DATE
  • address VARCHAR

Un ejemplo de una consulta SQL a la tabla de usuario antes de la ejecución UNION ALL:


SELECT   id,
         name,
         birthday,
         CAST(NULL AS VARCHAR) AS occupation,
         CAST(NULL AS INT) AS salary,
         CAST(NULL AS DATE) AS join,
         CAST(NULL AS VARCHAR) AS address,
         0 AS clazz
FROM  user

Un ejemplo de consulta SQL a la tabla de empleados antes de la ejecución UNION ALL:


SELECT   id,
         name,
         birthday,
         occupation,
         salary,
         join,
         CAST(NULL AS VARCHAR) AS address,
         1 AS clazz
FROM  employee

Un ejemplo de una consulta SQL a la tabla del cliente antes de la ejecución UNION ALL:


SELECT  id,
        name,
        birthday,
        CAST(NULL AS VARCHAR) AS occupation,
        CAST(NULL AS INT) AS salary,
        CAST(NULL AS DATE) AS join,
        address,
        2 AS clazz
FROM client

La buena noticia es que las consultas HQL funcionarán de la manera que usted desee.

La mala noticia es que pueden ser lentos si hay muchos datos en las tablas. Porque primero debe seleccionar datos de todas las tablas, luego combinar sus filas con UNION ALLy solo luego filtrar.