Leírás

Az osztályhierarchia tárolásának következő módja az, hogy a hierarchiában lévő összes osztályt egyetlen táblában tároljuk . Ezt a stratégiát Single Table-nak hívják .

Például így:

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

Vagyis van egy táblázatunk, amelyben a hierarchiánk összes osztályához tartozó oszlopok különböző színekkel vannak jelölve. Van egy speciális szolgáltatásoszlop is , a DTYPE VARCHAR , ahol a Hibernate tárolja az Entity osztály nevét.

Csak annyit kell tennie, hogy elmagyarázza a Hibernate-nek, hogy az Entity osztályok adatai mostantól egy táblában vannak tárolva az adatbázisban. Ezt megteheti az @Inheritance annotációval :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Példa az osztályainkra:

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

Az adatok tárolásának módja

Most írjunk egy példát, ahol létrehozunk néhány entitást, és elmentjük őket az adatbázisba:

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

Az adatbázisba történő mentéskor a következő SQL lekérdezés kerül végrehajtásra:

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

Amikor adatokat ment egy táblába, a Hibernate csak az általa ismert entitásmezőket adja át. Ez azt jelenti, hogy a nem meghatározott oszlopok NULL értéket kapnak.

Ez pedig azt jelenti, hogy nem adhatja meg a NOT NULL típust a foglalkozás oszlopban, mivel ha egy kliens ugyanabban a táblában van tárolva, akkor a foglalkozása NULL lesz. Ez az egyik hátránya a különböző entitások ugyanabban a táblában való tárolásának.

Az SQL lekérdezés utolsó mezője a DTYPE oszlop, amely az Entity osztály nevét tartalmazza. A Hibernate akkor használja, ha adatokat szeretne olvasni a táblából.

Példa:

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

Ez a lekérdezés az adatbázisban tárolt összes felhasználói típusú objektum listáját adja vissza: Felhasználó, alkalmazott és ügyfél. A DTYPE oszlop alapján az entitás típusa helyesen kerül meghatározásra, és létrejön a megfelelő osztályú objektum.

Esetünkben két objektum lesz a fióklistában: egy alkalmazott típus és egy ügyfél típus.

HQL szabályok.