JavaRush /Kurslar /All lectures for UZ purposes /Entitiylarning ierarxiyalari bilan ishlash

Entitiylarning ierarxiyalari bilan ishlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION