Sobes.tech
Junior — Middle

JPA-da tənbəl yükləmə ilə əlaqəli problemi təsvir edə bilərsinizmi?

sobes.tech Süni İntellekt

AI-dan cavab

JPA-da seansların gecikmiş yüklənməsi (lazy loading) problemi, əlaqəli varlıqların yalnız ilk dəfə onlara müraciət edildikdə verilənlər bazasından yüklənməsi ilə əlaqədardır və əsas varlıq yüklənərkən dərhal yüklənmir. Əgər sessiya (EntityManager) bağlanarsa və gecikmiş yüklənmiş verilənlərə giriş edilməyə çalışılırsa, LazyInitializationException istisnası baş verir.

Məsələn, əgər sizin Order adlı bir varlıq və onun gecikmiş yüklənmiş items kolleksiyası varsa və siz sifarişi bir metodda yükləmisinizsə və sonra sessiyanı bağlamısınızsa, sessiya xaricində order.getItems() çağırışında xəta alacaqsınız.

Bu problemi həll etmək üçün:

  • Əgər əsaslandırılıbsa, eager yükləmə (EAGER) istifadə edə bilərsiniz.
  • Ob'ektlərlə işləmə müddətində sessiyanı açıq saxlaya bilərsiniz (Open Session in View).
  • Gecikmiş kolleksiyaları sessiya daxilində açıq şəkildə başlatmaq olar, məsələn, Hibernate.initialize() çağıraraq.

Nümunə:

Order order = entityManager.find(Order.class, id);
Hibernate.initialize(order.getItems()); // sessiya daxilində başlatma
entityManager.close();
// İndi təhlükəsiz şəkildə order.getItems()-ə müraciət edə bilərsiniz