Junior — Middle
შეგიძლიათ აღწეროთ JPA-ში სესიის მელანქოლიური ჩატვირთვისთან დაკავშირებული პრობლემა?
sobes.tech AI
პასუხი AI-სგან
JPA-ში ლეიზი (lazy loading) სესიის პრობლემა დაკავშირებულია იმასთან, რომ დაკავშირებული ობიექტები იწერება მონაცემთა ბაზიდან მხოლოდ პირველი მიმართვისას, ხოლო არა მაშინვე მთავარი ობიექტის ჩატვირთვისას. თუ სესია (EntityManager) დაიხურება მანამდე, სანამ წვდომა მოხდება ლეიზით ჩატვირთულ მონაცემებზე, წარმოიქმნება LazyInitializationException გამონაკლისი.
მაგალითად, თუ გაქვთ Order ობიექტი და მისი ლეიზი კოლექცია items, და ჩატვირთავთ შეკვეთას ერთ მეთოდში, ხოლო შემდეგ სესია დაიხურება, მაშინ სესიის გარეთ order.getItems() მიმართვა გამოიწვევს შეცდომას.
ამ პრობლემის თავიდან ასაცილებლად, შეგიძლიათ:
- გამოიყენოთ eager ჩატვირთვა (EAGER), თუ ეს სამართლიანია.
- გახსნათ სესია ობიექტებთან მუშაობის დროს (Open Session in View).
- მკაფიოდ და ინიციალიზიროთ ლეიზი კოლექციები სესიის შიგნით, მაგალითად,
Hibernate.initialize()-ის გამოძახებით.
მაგალითი:
Order order = entityManager.find(Order.class, id);
Hibernate.initialize(order.getItems()); // ინიციალიზაცია სესიის შიგნით
entityManager.close();
// ახლა უსაფრთხოდ შეგიძლიათ მიმართოთ `order.getItems()`