JavaRush /Kurslar /All lectures for UZ purposes /Kolleksiyalarni xaritaga tushirishda Lazy Loading

Kolleksiyalarni xaritaga tushirishda Lazy Loading

All lectures for UZ purposes
Daraja, Dars
Mavjud

2.1 Fetch parametri

Hibernate ishlab chiquvchilari uzun vaqtdan beri qiziq bir muammo, ya'ni farzand entity-larni yuklash bilan bog'liq muammoni bilishardi. Shuning uchun ular birinchi qilgan narsa – bu @OneToMany, @ManyToMany annotatsiyalariga maxsus fetch parametrini qo'shishdi.

Bu parametr ikkita qiymat olishi mumkin:

  • EAGER
  • LAZY

Misol:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")

Agar fetch parametri EAGER bo'lsa, unda ota entity yuklanganda, uning barcha farzand entity-lari ham yuklanadi. Bundan tashqari, Hibernate buni bitta SQL so'rovi bilan amalga oshirishga harakat qiladi, katta so'rov yaratib, barcha ma'lumotlarni darhol oladi.

Agar fetch parametri LAZY qiymatini olsa, ota entity yuklanganda, farzand entity yuklanmaydi. Uning o'rniga proxy-ob'ekt yaratiladi.

Bu proxy-ob'ekt orqali Hibernate ushbu farzand entity-ga murojaat qilishni kuzatib boradi va birinchi marta murojaat qilinganda uni xotiraga yuklaydi.

Bizning sharhlar bilan bog'liq holatimizni eslab qol:


@Entity @Table(name="user")
class User {
   @Column(name="id")
   public Integer id;
 
   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "user_id")
   public List<Comment> comments;
}

Oxirida senga “a’lo tanlov” bor:

Agar fetch = FetchType.EAGER bo'lsa, Hibernate birinchi qator kodda barcha sharhlarni yuklaydi:


User user = session.get(User.class, 1);		//bu yerda barcha sharhlarni yuklaydi
List<Comment> comments = user.getComments();

Agar fetch = FetchType.LAZY bo'lsa, Hibernate ikkinchi qator kodda barcha sharhlarni yuklaydi:


User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //bu yerda barcha sharhlarni yuklaydi

Senga allaqachon oshkor bo'lgani kabi, barcha sharhlarni yuklamaydigan variant yo'q :)

2.2 Standart qiymat

Agar sen @ManyTo… annotatsiyalari uchun fetch parametrini ko'rsatmasang, Hibernate standart qiymatlarni qo'llaydi.

Ular turli annotatsiya turlari uchun biroz farq qiladi. @OneToOne va @ManyToOne annotatsiyalari uchun – bu EAGER, @OneToMany va @ManyToMany annotatsiyalari uchun – bu LAZY. Esda saqlash oson – agar bitta ob'ektga murojaat qilishsa, u to'liq yuklanadi. Agar kolleksiyaga murojaat qilishsa, u birinchi murojaatda yuklanadi.

2.3 @LazyCollection annotatsiyasi

Senga allaqachon ayon bo'lganidek, fetch parametri kolleksiyalar bilan ishlashda katta yordam bermaydi. Hibernate yaratuvchilari buni to'g'rilamoqchi bo'lib, maxsus @LazyCollection annotatsiyasini qo'shishdi. U odatda quyidagicha yoziladi:

@LazyCollection(LazyCollectionOption.TRUE)

Uni kolleksiya maydonlarini xaritaga tushirishda ko'rsatish kerak:


@Entity @Table(name="user")
class User {
   @Column(name="id")
   public Integer id;
 
   @OneToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.TRUE)
   public List<Comment> comments;
}

Bu annotatsiya value parametriga ega, va u uchta qiymatdan birini olishi mumkin:

  • LazyCollectionOption.TRUE
  • LazyCollectionOption.FALSE
  • LazyCollectionOption.EXTRA

Birinchi ikkita variant fetch parametriga juda o'xshaydi.

Agar parametr LazyCollectionOption.TRUE ga o'rnatilgan bo'lsa, bu comments maydon qiymatlari ota User ob'ekti yuklanganida bazadan yuklanmasligini anglatadi. Comment turidagi ob'ektlar birinchi marta comments maydoniga murojaat qilinganda yuklanadi. Bu haqiqiy FetchType.LAZY parametriga teng.

Agar parametr LazyCollectionOption.FALSE ga o'rnatilgan bo'lsa, bu comments maydon qiymatlari ota User ob'ekti yuklanganida bazadan yuklanadi degan ma'noni anglatadi. Comment turidagi ob'ektlar birinchi marta comments maydoniga murojaat qilinganda yuklanadi. Bu haqiqiy FetchType.EAGER parametriga teng.

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