¿Cuál es la diferencia entre el fetching LAZY y EAGER en JPA?
Opciones
- LAZY carga al primer acceso; EAGER carga junto con el padre (Opción correcta)
- LAZY siempre es más rápido y EAGER siempre más lento
- LAZY elimina los datos relacionados y EAGER los guarda
- No hay ninguna diferencia entre los dos modos
Respuesta
LAZY carga los datos relacionados solo cuando accedes a ellos por primera vez; EAGER los carga de inmediato junto con el padre
Por qué
Un User puede tener muchos Order. Con EAGER, cargar un usuario también carga todos sus pedidos de inmediato, aunque nunca los uses. Con LAZY, los pedidos se cargan de la base de datos solo cuando llamas por primera vez a user.getOrders().
Valores por defecto: @OneToMany es LAZY, @ManyToOne es EAGER.
LAZY evita cargar de más, pero acceder a un campo lazy después de cerrar la sesión o transacción lanza LazyInitializationException. Una recomendación común es usar LAZY y traer lo necesario de forma explícita (JOIN FETCH o @EntityGraph).
Recuerda
Prefiere LAZY y trae explícitamente lo que necesite cada caso de uso.