Sobes.tech
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()`ке кире аласыз