Saqlash masalalari
Bugun yangi va juda qiziqarli sxemani ko'ramiz — Hibernate imkoniyatlaridan foydalanib, sinflar ierarxiyasini bazaga saqlash.
Sinflar ierarxiyasi — bu bir-biriga meros bo'lib bog'langan bir nechta sinflar.
Faraz qil, sening bazada saqlamoqchi bo'lgan uchta sinfing bor:
class User {
int id;
String name;
LocalDate birthday;
}
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
class Client extends User {
String address;
}
Sinflar bir-biridan meros olingan. Eng qiziq tomoni shundaki, sen ushbu sinflar ob'ektini ma'lumotlar bazasida saqlash uchun Hibernate'dan foydalanishni xohlaysan.
Ye'chim turlari
Hibernate'da sinflar ierarxiyasini ma'lumotlar bazasidagi jadvallar bilan bog'lashning to'rtta mumkin bo'lgan usuli mavjud:
- MappedSuperclass
- Single Table
- Joined Table
- Table per class
Har bir strategiya o'ziga xos jadval tuzilishini talab qiladi. Ba'zan ular juda murakkab bo'lishi mumkin. Ammo ularga HQL so'rovlar qilish juda oddiy. Bu yerda Hibernate afzalliklari yaqqol ko'rinadi.
Bu terminlarni o'zbek tiliga tarjima qilganini hech qachon eshitmaganman, shuning uchun ularni ingliz tilida talaffuz qilishni tavsiya qilaman.
Quyida, har biri nima ma'noni anglatishini tahlil qilamiz.
@MappedSuperClass
Eng oddiy yechimdan boshlaymiz — bazada har bir sinf uchun alohida jadvallar bor. Masalan, quyidagilar:
CREATE TABLE user {
id INT,
name VARCHAR,
birthday DATE
}
CREATE TABLE employee {
id INT,
name VARCHAR,
birthday DATE,
occupation VARCHAR,
salary INT,
join DATE
}
CREATE TABLE client {
id INT,
name VARCHAR,
birthday DATE,
address VARCHAR
}
Sinflar ushbu jadvallar uchun ierarxiyaga bog'langanligini faqat sen bilasan. Agar bu haqda Hibernate ham bilishini xohlasang, ota-ona sinfga @MappedSuperclass annotatsiyasini qo'shishing kerak. Bo'lmasa Hibernate ota-ona sinfning maydonlari va annotatsiyalarini e'tiborsiz qoldiradi.
Bu annotatsiyaga ega sinflar quyidagicha ko'rinadi:
@MappedSuperclass
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;
}
Bu sinflar ierarxiyasini ma'lumotlar bazasi bilan bog'lashning eng sodda usuli. Bunday yondashuv faqat sinflardagi maydonlarning dublikatlarini oldini olishga imkon beradi.
HQL'da bazaga so'rovlar faqat aniq ko'rsatilgan turdagi entitiylarni qaytaradi. Sen bazaga HQL orqali so'rov yuborib, barcha foydalanuvchilar ro'yxatini ololmaysan: User, Employee, Client.
GO TO FULL VERSION