Tavsif
Sinflar iyerarxiyasini saqlashning navbatdagi usuli – bu barcha iyerarxiya sinflarini bitta jadvalda saqlash. Bunday strategiya Single Table deb ataladi.
Misol uchun, quyidagicha:
CREATE TABLE user_ employee_client {
id INT,
name VARCHAR,
birthday DATE,
occupation VARCHAR,
salary INT,
join DATE,
address VARCHAR,
DTYPE VARCHAR
}
Ya'ni bizda bitta jadval bor, unda barcha sinflar uchun ustunlar turli xil ranglarda belgilangan. Shuningdek, maxsus xizmat ustuni DTYPE VARCHAR mavjud bo'lib, unda Hibernate Entity-sinf nomini saqlaydi.
Endi ozgina ish qoldi – Hibernate-ga tushuntirish kerak, Entity-sinf ma'lumotlari endi bitta jadvlda saqlanmoqda. Buni @Inheritance annotatsiyasi yordamida amalga oshirish mumkin:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
Bizning sinflarimizning misoli:
@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;
}
Ma'lumotlar qanday saqlanadi
Endi bir necha entity-larimizni yaratib, ularni bazada saqlash misolini yozamiz:
Employee employee = new Employee();
employee.id = 101;
employee.name = "Иванов";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmist"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);
Client client = new Client();
client.id = 102;
client.name = "Петров";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Шандара";
session.persist(client);
Bazaga ma'lumotlarni saqlashda quyidagi SQL-so'rovi bajariladi:
INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Иванов', '01-01-1999', 'Programmist', 100000, '12-01-2018', 'Employee')
INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Петров', '15-11-1988', 'Шандара', 'Client')
Ma'lumotlarni jadvalga saqlashda Hibernate faqat unga ma'lum bo'lgan entity maydonlarini o'tkazadi. Bu esa nomuayyan ustunlar NULL qiymatga ega bo'lishini anglatadi.
Bu shuni anglatadiki, occupation ustuniga NOT NULL turini berolmaysiz, chunki shu jadvalda client saqlanganda uning occupation NULL bo'ladi. Bu turli entity-larni bitta jadvlda saqlashning kamchiliklaridan biridir.
SQL-so'rovining oxirgi maydoni – bu DTYPE ustuni bo'lib, unda Entity-sinf nomi o'tkaziladi. Hibernate uni jadvaldan ma'lumotlarni o'qimoqchi bo'lganingizda ishlatadi.
Misol:
List<User> accounts = session.createQuery("from User").list();
Ushbu so'rov bazada saqlangan barcha User, Employee va Client turidagi obyektlarning ro'yxatini qaytaradi. DTYPE ustuniga asoslanib, entity turi to'g'ri aniqlanadi va to'g'ri sinfning obyekti yaratiladi.
Bizning holatda accounts ro'yxatida Employee va Client turidagi ikki obyekt bo'ladi.
HQL qudratli.
GO TO FULL VERSION