LAZY — load on access. EAGER — load immediately.
LAZY:
1@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)2private List<Order> orders;3// Orders loaded when getOrders() called
EAGER:
1@ManyToOne(fetch = FetchType.EAGER)2private User user;3// User loaded with Order
How it works:
N+1 problem:
1// JOIN FETCH to solve N+12@Query("SELECT u FROM User u JOIN FETCH u.orders WHERE u.id = :id")3User findByIdWithOrders(@Param("id") Long id);
Best practice: