Middle — Middle+
97
Hibernate-де LazyInitializationException пайда болуын қалай болдырмауға болады?
Сұралған компаниялар
AI-дан жауап
sobes.tech AI
LazyInitializationException Hibernate сессиясы жабық болған кезде ленивті жүктелген (lazy) байланысты объектке қол жеткізуге тырысқанда пайда болады.
Бұл қателікті болдырмаудың әдістері:
-
Деректерді сессия ішінде инициализациялау:
Hibernate.initialize()қолдану немесе сессия жабылмай тұрып ленивті коллекциялар/объектілерді жүктеу үшін геттерлерді шақыру.
-
FetchType.EAGER қолдану:
- Ленивті жүктеуді жедел жүктеуге ауыстыру, яғни байланысты деректер бірден жүктеледі.
- Минус — артық деректер жүктеуге әкелуі мүмкін.
-
JPQL/HQL-де JOIN FETCH қолдану:
- Байланысқан объектілерді жүктеуді нақты көрсету үшін таңдау кезінде пайдалану.
-
Open Session in View (OSIV):
- Hibernate сессиясын сұрау өңделгенше ашық ұстау (мысалы, веб-қосымшаларда).
- Бұл ленивті жүктеуді көрініс қабаттарында қолдануға мүмкіндік береді.
-
DTO және проекциялар:
- Қажетті деректерді DTO объектілеріне сұраулар арқылы жүктеу, сессия жабылғаннан кейін ленивті коллекцияларға қол жеткізбеу үшін.
JOIN FETCH қолданудың мысалы:
String hql = "FROM Order o JOIN FETCH o.items WHERE o.id = :id";
Order order = session.createQuery(hql, Order.class)
.setParameter("id", orderId)
.uniqueResult();
// items тапсырысымен бірге жүктеледі
Әдіс таңдау қолданбаның архитектурасына және өнімділік талаптарына байланысты.