Opis
Kolejnym podejściem do przechowywania hierarchii klas jest przechowywanie wszystkich klas w hierarchii w pojedynczej tabeli . Ta strategia nazywa się Single Table .
Na przykład tak:
CREATE TABLE user_ employee_client {
id INT,
name VARCHAR,
birthday DATE,
occupation VARCHAR,
salary INT,
join DATE,
address VARCHAR,
DTYPE VARCHAR
}
Czyli mamy jedną tabelę, w której różne kolory oznaczają kolumny dla wszystkich klas naszej hierarchii. Istnieje również specjalna kolumna usługi DTYPE VARCHAR , w której Hibernate będzie przechowywać nazwę klasy Entity.
Pozostało tylko wyjaśnić Hibernate, że dane klas Entity są teraz przechowywane w bazie danych w jednej tabeli. Można to zrobić za pomocą adnotacji @Inheritance :
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
Przykład naszych zajęć:
@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;
}
Jak przechowywane są dane
Teraz napiszmy przykład, w którym tworzymy kilka naszych encji i zapisujemy je w bazie danych:
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);
Podczas zapisywania do bazy danych zostanie wykonane następujące zapytanie 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')
Podczas zapisywania danych w tabeli Hibernate przekazuje tylko znane mu pola encji. Oznacza to, że nieokreślone kolumny będą miały wartość NULL.
Oznacza to, że nie można określić typu NOT NULL dla kolumny zajętości, ponieważ gdy klient jest przechowywany w tej samej tabeli, jego zawód będzie miał wartość NULL. Jest to jedna z wad przechowywania różnych jednostek w tej samej tabeli.
Ostatnim polem w zapytaniu SQL jest kolumna DTYPE, która zawiera nazwę klasy Entity. Jest używany przez Hibernate, gdy chcesz odczytać dane z tabeli.
Przykład:
List<User> accounts = session.createQuery("from User").list();
To zapytanie zwróci listę wszystkich obiektów typu użytkownika przechowywanych w bazie danych: Użytkownik, Pracownik i Klient. Na podstawie kolumny DTYPE zostanie poprawnie określony typ encji i utworzony zostanie obiekt odpowiedniej klasy.
W naszym przypadku na liście rachunków będą dwa obiekty: typ Pracownika i typ Klienta.
Zasady HQL.
GO TO FULL VERSION