Descrição

A próxima abordagem para armazenar uma hierarquia de classe é armazenar todas as classes na hierarquia em uma única tabela . Essa estratégia é chamada de Tabela Única .

Por exemplo, assim:

CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

Ou seja, temos uma tabela, na qual as colunas de todas as classes da nossa hierarquia são marcadas com cores diferentes. Há também uma coluna de serviço especial DTYPE VARCHAR , onde o Hibernate armazenará o nome da classe Entity.

A única coisa que resta a fazer é explicar ao Hibernate que os dados das classes Entity agora estão armazenados no banco de dados em uma tabela. Isso pode ser feito usando a anotação @Inheritance :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Exemplo de nossas aulas:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@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;
}

Como os dados são armazenados

Agora vamos escrever um exemplo onde criamos algumas de nossas entidades e as salvamos no banco de dados:

Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);

Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);

Ao salvar no banco de dados, a seguinte consulta SQL será executada:

INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')

INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')

Ao salvar dados em uma tabela, o Hibernate passa apenas os campos de entidade conhecidos por ele. Isso significa que as colunas não especificadas serão NULL.

E isso significa que você não pode especificar o tipo NOT NULL para a coluna de ocupação, pois quando um cliente for armazenado na mesma tabela, sua ocupação será NULL. Essa é uma das desvantagens de armazenar diferentes entidades na mesma tabela.

O último campo da consulta SQL é a coluna DTYPE, que contém o nome da classe Entidade. Ele é usado pelo Hibernate quando você deseja ler os dados da sua tabela.

Exemplo:

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

Esta consulta retornará uma lista de todos os objetos do tipo usuário armazenados no banco de dados: Usuário, Funcionário e Cliente. Com base na coluna DTYPE, o tipo de entidade será determinado corretamente e um objeto da classe correta será criado.

No nosso caso, haverá dois objetos na lista de contas: um tipo Funcionário e um tipo Cliente.

Regras HQL.