Junior — Middle
Tudnál leírni egy problémát, ami a JPA-ban a lusta betöltéssel kapcsolatos?
sobes.tech MI
Válasz az MI-től
A JPA-ban a késleltetett betöltés (lazy loading) problémája az, hogy a kapcsolódó entitások csak az első hozzáféréskor töltődnek be az adatbázisból, és nem közvetlenül a fő entitás betöltésekor. Ha a session (EntityManager) bezárul, mielőtt a késleltetett módon betöltött adatokhoz hozzáférnénk, akkor LazyInitializationException kivétel keletkezik.
Például, ha van egy Order entitásod késleltetett items kollekcióval, és egy módszerben betöltöd a rendelést, majd bezárod a session-t, akkor a sessionen kívül a order.getItems() hívás hibát fog eredményezni.
Ennek a problémának a kiküszöbölésére lehet:
- Eager betöltést (EAGER) használni, ha indokolt.
- A sessiont nyitva tartani az objektumokkal való munkavégzés ideje alatt (Open Session in View).
- Kifejezetten inicializálni a késleltetett kollekciókat a sessionön belül, például a
Hibernate.initialize()hívásával.
Példa:
Order order = entityManager.find(Order.class, id);
Hibernate.initialize(order.getItems()); // inicializálás a sessionön belül
entityManager.close();
// Most már biztonságosan hozzáférhet a order.getItems() -hez