Tavsif
Oldingi darsda sen ko'rdingki, Hibernate Entity-klass nomini saqlash uchun maxsus DTYPE VARCHAR ustunidan foydalanadi. Bu ustun diskriminator deb ataladi. Uni ma'lumotlar bazasidagi qator uchun qaysi klassni hosil qilish kerakligini aniqlash uchun ishlatishadi.
Siz bu ustunni @DiscriminatorColumn annotatsiyasi yordamida boshqarishingiz mumkin. Misol:
@DiscriminatorColumn(name="ustun_nomi", discriminatorType = DiscriminatorType.INTEGER)
JPA spesifikatsiyasiga ko'ra, diskriminator quyidagi turlarga ega bo'lishi mumkin:
- STRING
- CHAR
- INTEGER
Ammo Hibernate bu ro'yxatni biroz kengaytiradi. U quyidagi Java-turlarini qo'llab-quvvatlaydi: String, char, int, byte, short, boolean.
Agar INTEGER turidan foydalansak, unda Entity-klass nomini qanday kodlash mumkin? Buning uchun yana bir annotatsiya – @DiscriminatorValue ishlatiladi.
Misolga qarang:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type", discriminatorType = DiscriminatorType.INTEGER)
@Entity
class User {
int id;
String name;
LocalDate birthday;
}
@Entity
@DiscriminatorValue("1")
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
@Entity
@DiscriminatorValue("2")
class Client extends User {
String address;
}
Yuqoridagi misolda biz Hibernate ga diskriminator uchun user_type ustunidan foydalanilishini aytdik, bu ustun raqamlarni saqlaydi. Agar unga 1 qiymati saqlansa, unda qator turi – Employee, agar 2 saqlansa, unda qator turi – Client. Oddiy va chiroyli.
@DiscriminatorValue
Lekin bu hammasi emas. Siz Hibernate'ga qachonki diskriminator NULL ga teng bo'lsa, qator turini qanday interpretatsiya qilishni ko'rsatishingiz mumkin.
Aslida bu juda oddiy. Siz @DiscriminatorValue annotatsiyasida null qiymatini ko'rsatasiz. Masalan, shunday:
@DiscriminatorValue("null")
Klass misoli:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("null")
@Entity
class User {
int id;
String name;
LocalDate birthday;
}
Biz Hibernate'ga user_type ustunidagi NULL qiymatiga ega bo'lgan har qanday qator User tipidagi obyekt sifatida interpretatsiya qilinishi kerakligini aytdik.
Lekin bu hammasi emas. @DiscriminatorValue annotatsiyasida yana bir qiziqarli qiymat mavjud.
Bu quyidagi kabi:
@DiscriminatorValue("not null")
Klass misoli:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("not null")
@Entity
class User {
int id;
String name;
LocalDate birthday;
}
Bu annotatsiya yordamida biz Hibernate'ga user_type ustunida NULL bo'lmagan qiymat mavjud bo'lsa, qator User tipidagi obyekt sifatida interpretatsiya qilinishi kerak deb ko'rsatib berdik. Lekin bu faqat zarur raqam ko'rsatilgan klass topilmasa ishlaydi.
Bu turli diskriminator qiymatlari uchun shunday ishlaydi:
- 0 – User tipidagi obyekt yaratiladi
- 1 – Employee tipidagi obyekt yaratiladi
- 2 – Client tipidagi obyekt yaratiladi
- 3 – User tipidagi obyekt yaratiladi
- 4 – User tipidagi obyekt yaratiladi
@DiscriminatorFormula
Lekin bu hammasi emas. Bizning diskriminatorimiz uchun u @DiscriminatorValue annotatsiyasidagi qiymatlarni hisoblash uchun butun bir formulani ko'rsatishimiz mumkin.
Buning uchun maxsus annotatsiya mavjud, u @DiscriminatorFormula deb ataladi.
Misol:
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="user_type", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorFormula("case when ‘join’ is not null then 1 else 2 end")
@Entity
class User {
int id;
String name;
LocalDate birthday;
}
@Entity
@DiscriminatorValue("1")
class Employee extends User {
String occupation;
int salary;
LocalDate join;
}
@Entity
@DiscriminatorValue("2")
class Client extends User {
String address;
}
@DiscriminatorFormula tomonidan qaytarilgan qiymatlar Hibernate tomonidan @DiscriminatorValue annotatsiyalarida ko'rsatilgan qiymatlar bilan solishtiriladi. Bu orqali juda murakkab ssenariylarni yozish mumkin:
@DiscriminatorFormula(
"case when address is not null " +
"then 'Client' " +
"else (" +
" case when occupation is not null " +
" then 'Employee' " +
" else 'Unknown' " +
" end) " +
"end "
)
GO TO FULL VERSION