Sobes.tech
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