Beskrivelse

Den næste tilgang til lagring af et klassehierarki er at gemme alle klasser i hierarkiet i en enkelt tabel . Denne strategi kaldes Single Table .

For eksempel sådan her:

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

Det vil sige, at vi har én tabel, hvor kolonnerne for alle klasser i vores hierarki er markeret med forskellige farver. Der er også en speciel servicekolonne DTYPE VARCHAR , hvor Hibernate gemmer navnet på Entity-klassen.

Det eneste, der er tilbage at gøre, er at forklare Hibernate, at dataene for Entity-klasser nu er gemt i databasen i én tabel. Dette kan gøres ved at bruge @Inheritance -annotationen :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Et eksempel på vores klasser:

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

Hvordan data opbevares

Lad os nu skrive et eksempel, hvor vi opretter et par af vores entiteter og gemmer dem i databasen:

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

Når du gemmer til databasen, udføres følgende SQL-forespørgsel:

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

Når du gemmer data i en tabel, sender Hibernate kun enhedsfelter, som den kender. Det betyder, at uspecificerede kolonner vil være NULL.

Og det betyder, at du ikke kan angive typen NOT NULL for besættelseskolonnen, da når en klient er gemt i samme tabel, vil hans besættelse være NULL. Dette er en af ​​ulemperne ved at gemme forskellige enheder i samme tabel.

Det sidste felt i SQL-forespørgslen er kolonnen DTYPE, som indeholder navnet på Entity-klassen. Det bruges af Hibernate, når du vil læse data fra din tabel.

Eksempel:

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

Denne forespørgsel returnerer en liste over alle objekter af brugertype, der er gemt i databasen: Bruger, Medarbejder og Klient. Baseret på DTYPE-kolonnen vil entitetstypen blive korrekt bestemt, og et objekt af den korrekte klasse vil blive oprettet.

I vores tilfælde vil der være to objekter på kontolisten: en medarbejdertype og en klienttype.

HQL regler.