Problemas de conservación

Hoy tendremos un esquema nuevo y súper interesante: usar las funciones de Hibernate para guardar la jerarquía de clases en la base de datos.

Una jerarquía de clases es un conjunto de clases relacionadas entre sí por una relación de herencia.

Imagine que tiene tres clases que desea almacenar en la base de datos:

class User {
  int id;
  String name;
  LocalDate birthday;
}
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
class Client extends User {
   String address;
}

Las clases se heredan unas de otras. Y lo más interesante es que quieres usar Hibernate para almacenar objetos de estas clases en la base de datos.

Tipos de solución

Hibernate tiene 4 formas posibles de asociar una jerarquía de clases con tablas en una base de datos:

  • Superclase asignada
  • mesa individual
  • Tabla unida
  • Mesa por clase

Cada estrategia asume su propia estructura de tabla en la base de datos. A veces son bastante complejos. Pero las consultas de HQL para ellos son muy simples. Este es exactamente el caso donde las ventajas de Hibernate se manifiestan claramente.

Nunca he escuchado estos términos traducidos al ruso, así que también recomiendo pronunciarlos en inglés.

A continuación analizaremos qué significa cada uno de ellos.

@MappedSuperClass

Comencemos con la solución más simple: en la base de datos tiene 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
}

Solo usted sabe que las clases de estas tablas están conectadas en una jerarquía . Si desea que Hibernate también sepa sobre esto, debe agregar la anotación @MappedSuperclass a la clase principal . Sin él, Hibernate simplemente ignorará los campos y las anotaciones de la clase principal.

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

@MappedSuperclass
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;
}

Esta es la forma más primitiva de vincular la jerarquía de clases y la base de datos. Este enfoque en realidad solo le permite evitar campos duplicados en las clases.

Las consultas de base de datos en HQL devolverán solo la entidad cuyo tipo se especifica explícitamente. No puede escribir una consulta de base de datos en HQL y obtener una lista de todos los usuarios: Usuario, Empleado, Cliente.