Table per class

All lectures for UZ purposes
Daraja, Dars
Mavjud

5.1 Tavsif

Va nihoyat, oxirgi strategiya – bu Table per class. Bu demak, har bir sinf uchun alohida jadval ishlatiladi. Boshqacha qilib aytganda – bu MappedSuperClass, lekin yangilangan ko'rinishda.

Birinchidan, sening @Inheritance annotatsiyasidan foydalanishing kerak bo'ladi:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

Ushbu annotatsiya bilan sinflar quyidagicha ko'rinadi:


@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@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;
}

Va har bir sinf uchun alohida jadvallar. Masalan, quyidagicha:


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
}

Asosiy farqi – bu barcha jadvallar uchun bir xil id (PRIMARY KEY) ishlatiladi. Sen nafaqat bir jadval ichida, balki ushbu guruh jadvallari ichida ham har xil id bilan satrlar bo'lishiga imkon berolmaysan. Hibernate bunga qo'rqadi.

5.2 Misollar

Buni qanday ishlashi qiziqarli.

Barcha foydalanuvchilarni olish uchun oddiy HQL-so'rovini yozishing mumkin: User, Employee, Client:

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

Lekin, Hibernate juda qiziqarli so'rovni ishlab chiqadi. U barcha jadvallardan tanlovni o'tkazadi, keyin UNION ALL orqali integratsiya qilib, virtual jadvalga o'xshatadi va faqat shundan so'ng qidiruv va/yoki tanlov amalga oshiriladi.

Lekin turli ustunlar bilan jadvallarni birlashtirish uchun avval ularni soxta ustunlar bilan to'ldirish kerak bo'ladi. Masalan, user jadvali quyidagi ustunlar bilan to'ldirilishi kerak:

  • occupation VARCHAR
  • salary INT
  • join DATE
  • address VARCHAR

UNION ALLdan oldin user jadvali uchun SQL-so'rov namunasini keltiray:


SELECT   id,
         name,
         birthday,
         CAST(NULL AS VARCHAR) AS occupation,
         CAST(NULL AS INT) AS salary,
         CAST(NULL AS DATE) AS join,
         CAST(NULL AS VARCHAR) AS address,
         0 AS clazz
FROM  user

UNION ALLdan oldin employee jadvali uchun SQL-so'rov namunasini keltiray:


SELECT   id,
         name,
         birthday,
         occupation,
         salary,
         join,
         CAST(NULL AS VARCHAR) AS address,
         1 AS clazz
FROM  employee

UNION ALLdan oldin client jadvali uchun SQL-so'rov namunasini keltiray:


SELECT  id,
        name,
        birthday,
        CAST(NULL AS VARCHAR) AS occupation,
        CAST(NULL AS INT) AS salary,
        CAST(NULL AS DATE) AS join,
        address,
        2 AS clazz
FROM client

Yaxshi xabar: HQL-so'rovlar sen o'ylaganingdek ishlaydi.

Yomon xabar: Agar jadvallarda juda ko'p ma'lumot bo'lsa, ular sekin ishlashlari mumkin. Chunki avval ma'lumotlarni barcha jadvallardan tanlab olish kerak, keyin satrlarni UNION ALL bilan birlashtirish, va shundan keyin filtrlanish bajariladi.

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