Kolleksiyalar ro'yxati
Xo'sh, sen oddiy turlarni qanday map qilishni o'rganding. Endi esa yanada qiziqarli savollarga o'tish vaqti – obyektlar kolleksiyalarini qanday map qilish haqida.
Bizning obyektlarimiz 5 guruhda bo'lishi mumkin:
- Array – obyektlar massivlari
- List – obyektlar ro'yxati
- Set – obyektlar to'plami
- Map – obyektlar lug'ati
- Collection – obyektlar kollektsiyasi
Va, kolleksiya maydoni bo'lgan kelasning misoli:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@Волшебная-аннотация
public List
messages; }
Xo'sh, bu qanday sehrli annotatsiya ekanligini bilib olaylik. Bizga bitta maydon emas, balki ko'plab qiymatlarni saqlashga imkon beradigan annotatsiya?
Bu annotatsiya @ElementCollection deb ataladi. Misol:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@ElementCollection
public List<String> messages;
}
Uni yozish juda oddiy, lekin ishlashi murakkabroq.
Qo'shimcha jadval
Ko'plab elementlarni o'z ichiga olgan va @ElementCollection annotatsiyasi bilan belgilangan Entity-kelassining barcha maydonlari ma'lumotlar bazasida maxsus qo'shimcha jadvalda saqlanadi. Bu, aslida, mantiqiy.
Bu jadval ikki turdagi ma'lumotlarni o'z ichiga olishi mumkin:
- Tartiblangan (List, Map) uchta ustunga ega:
- Key Column (Foreign Key) – asosiy obyektning IDiga link.
- Index Column – kolleksiyadagi holat/indeks.
- Element Column – qiymat.
- Tartiblanmagan (Set) ikki ustunga ega:
- Key Column (Foreign Key) – asosiy obyektning IDiga link.
- Element Column – qiymat.
Shuningdek, sen bu jadval nomini annotatsiya yordamida aniq belgilashing mumkin:
@CollectionTable(name="jadval_nomi")
Misol:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@ElementCollection
@CollectionTable(name="user_message")
public List<String> messages;
}
Мухим! Agar @CollectionTable annotatsiyasi keltirilmagan bo'lsa, Hibernate jadval nomini kelas nomi va maydon nomiga asosan o'zi yaratadi: kelas User va maydon messages "User_messages" jadval nomini beradi.
Set kollektsiyasi
Lekin keling qo'shimcha jadvalni yaratishni Hibernate'ga topshirmaylik va uni o'zimiz yaratamiz. Avvaliga ikkita ustunli jadvalni yaratishimiz kerak:
CREATE TABLE user_message {
user_id INT,
message VARCHAR(255)
};
Bu jadvalning o'z ID-ustuni yo'qligiga e'tibor ber. Bu, aslida, qo'shimcha jadvallar uchun asosiy belgi hisoblanadi. Boshqa turdagi qo'shimcha jadvallar bilan keyinchalik tanishasan.
Endi esa, bu jadvalni User kelassidagi messages maydonimizga map qilishimiz kerak. Bu ish quyidagicha ko'rinadi:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@ElementCollection
@CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "message")
public Set<String> messages;
}
Bu yerda ikkita narsaga e'tibor berish lozim.
Birinchidan, message ustuni, @Column(name = "message") annotatsiyasi orqali ko'rsatilgan, user_message qo'shimcha jadvalda joylashgan, user jadvalida emas.
Ikkinchidan, @JoinColumn(name = "user_id") annotatsiyasida biz user_id ustun nomini ko'rsatdik, bu user jadvalining id-ga link qiladi. Bu Hibernate'ga ularni to'g'ri birlashtirishni bilish uchun zarur.
List колlektsiyasi
Agar qo'shimcha jadvalda tartiblangan ro'yxat yoki massiv elementlarini saqlamoqchi bo'lsang, unda uchta ustunli jadval kerak bo'ladi:
CREATE TABLE user_message {
user_id INT,
index INT,
message VARCHAR(255)
};
Agar "index" ustun nomi yoqmiydigan bo'lsa yoki uni o'zgartira olmasang, map qilish vaqtida boshqa nomni ko'rsatish mumkin. Buning uchun @Index annotatsiyasidan foydalanish kerak.
Misol:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@ElementCollection
@CollectionTable(name="user_message",
indexes = { @Index(columnList = "list_index") }
joinColumns = @JoinColumn(name = "user_id"))
@Column(name = "message")
public List<String> messages;
}
Map коллекtsiyasi
Nihoyat, sen oddiy kollektsiya emas, balki HashMap saqlashni xohlaysan va buning uchun qo'shimcha jadvalda ikki ustun kerak bo'ladi:
CREATE TABLE user_message {
user_id INT,
key VARCHAR(255),
message VARCHAR(255)
};
Map uchun kalitni ko'rsatish uchun @MapKeyColumn annotatsiyasidan foydalanish kerak bo'ladi.
Misol:
@Entity
@Table(name="user")
class User {
@Id
@Column(name="id")
public Integer id;
@ElementCollection
@CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
@MapKeyColumn(name = "key")
@Column(name = "message")
public Map<String, String> messages;
}
Batafsil ma'lumotni sen rasmiy hujjatlarda topishing mumkin.
GO TO FULL VERSION