| Lazy | Eager | |
|---|---|---|
| Load khi | Lần đầu truy cập field | Luôn load cùng entity chính |
| Default | @OneToMany, @ManyToMany | @ManyToOne, @OneToOne |
Đổi qua attribute fetch: @ManyToOne(fetch = FetchType.LAZY).
Vấn đề Eager: luôn load association dù không cần → query thừa, chậm.
Vấn đề Lazy: LazyInitializationException khi truy cập field ngoài transaction (session đã đóng).
Fix Lazy: @Transactional trên method service (giữ session mở); JOIN FETCH trong JPQL để load kèm trong 1 query; DTO projection chỉ lấy field cần (code cụ thể xem câu N+1).
Best practice: mặc định Lazy — kể cả cân nhắc chỉnh @ManyToOne (vốn Eager) về Lazy; chỉ Eager/JOIN FETCH khi chắc chắn mọi use case đều cần data đó.