Descriere

Următoarea abordare a stocării unei ierarhii de clase este de a stoca toate clasele din ierarhie într-un singur tabel . Această strategie se numește Single Table .

De exemplu, așa:

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

Adică avem un singur tabel, în care coloanele pentru toate clasele ierarhiei noastre sunt marcate cu culori diferite. Există, de asemenea, o coloană de serviciu specială DTYPE VARCHAR , unde Hibernate va stoca numele clasei Entity.

Singurul lucru care rămâne de făcut este să îi explici lui Hibernate că datele claselor Entity sunt acum stocate în baza de date într-un singur tabel. Acest lucru se poate face folosind adnotarea @Inheritance :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Un exemplu de orele noastre:

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

Cum sunt stocate datele

Acum să scriem un exemplu în care creăm câteva dintre entitățile noastre și le salvăm în baza de date:

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);

La salvarea în baza de date, se va executa următoarea interogare SQL:

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')

Când salvează date într-un tabel, Hibernate transmite numai câmpuri de entitate cunoscute. Aceasta înseamnă că coloanele nespecificate vor fi NULL.

Și asta înseamnă că nu poți specifica tipul NOT NULL pentru coloana de ocupație, deoarece atunci când un client este stocat în același tabel, ocupația lui va fi NULL. Acesta este unul dintre dezavantajele stocării diferitelor entități în același tabel.

Ultimul câmp din interogarea SQL este coloana DTYPE, care conține numele clasei Entity. Este folosit de Hibernate atunci când doriți să citiți date din tabelul dvs.

Exemplu:

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

Această interogare va returna o listă a tuturor obiectelor de tip utilizator stocate în baza de date: Utilizator, Angajat și Client. Pe baza coloanei DTYPE, tipul de entitate va fi determinat corect și va fi creat un obiect din clasa corectă.

În cazul nostru, vor exista două obiecte în lista de conturi: un tip de angajat și un tip de client.

Reguli HQL.