questões de conservação

Hoje teremos um esquema novo e super interessante - usando os recursos do Hibernate para salvar a hierarquia de classes no banco de dados.

Uma hierarquia de classes é um conjunto de classes relacionadas entre si por um relacionamento de herança.

Imagine que você tem três classes que deseja armazenar no banco de dados:

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

As classes são herdadas umas das outras. E o mais interessante é que você deseja usar o Hibernate para armazenar objetos dessas classes no banco de dados.

Tipos de solução

O Hibernate tem 4 maneiras possíveis de associar uma hierarquia de classes com tabelas em um banco de dados:

  • Superclasse mapeada
  • mesa única
  • Tabela unida
  • Mesa por aula

Cada estratégia assume sua própria estrutura de tabela no banco de dados. Às vezes, eles são bastante complexos. Mas as consultas de HQL para eles são muito simples. Este é exatamente o caso em que as vantagens do Hibernate são claramente manifestadas.

Nunca ouvi esses termos traduzidos para o russo, então também recomendo pronunciá-los em inglês.

A seguir, analisaremos o que significa cada um deles.

@MappedSuperClass

Vamos começar com a solução mais simples - no banco de dados você tem tabelas separadas para cada classe . Por exemplo, estes:

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
}

Só você sabe que as classes dessas tabelas estão conectadas em uma hierarquia . Se você quiser que o Hibernate saiba disso também, você precisa adicionar a anotação @MappedSuperclass à classe pai . Sem ele, o Hibernate irá simplesmente ignorar os campos e anotações da classe pai.

Classes com esta anotação ficarão assim:

@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 é a forma mais primitiva de vincular a hierarquia de classes e o banco de dados. Na verdade, essa abordagem permite apenas evitar campos duplicados nas classes.

As consultas de banco de dados em HQL retornarão apenas a entidade cujo tipo é especificado explicitamente. Você não pode escrever uma consulta de banco de dados em HQL e obter uma lista de todos os usuários: Usuário, Funcionário, Cliente.