4 trạng thái của entity đối với Persistence Context:
- Transient (new) — vừa
new, JPA chưa biết đến, chưa có row trong DB. - Managed (persistent) — đang được Persistence Context theo dõi (sau
persist(),find(), hoặc query trả về) → hưởng dirty checking: sửa field, đến lúc commit là tự UPDATE, không cần gọi save(). - Detached — Persistence Context đã đóng (transaction kết thúc) hoặc bị
detach()→ object vẫn còn nhưng không được theo dõi; sửa gì JPA cũng không biết. Gắn lại bằngmerge()— lưu ý merge trả về bản managed MỚI, không phải object cũ. - Removed — bị đánh dấu xoá qua
remove(); DELETE thực thi khi flush/commit.
Đây là gốc của nhiều bẫy quen thuộc:
- LazyInitializationException = truy cập lazy field trên entity detached (ngoài transaction).
- "Sửa entity trong @Transactional mà không gọi save() vẫn được lưu" = vì entity đang managed, dirty checking lo phần còn lại.