JavaRush /Kurslar /All lectures for UZ purposes /Kolleksiyalarni map qilish

Kolleksiyalarni map qilish

All lectures for UZ purposes
Daraja, Dars
Mavjud

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.

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