
Written on 13th April 2026 by Carter Phan.
Hibernate sync object ↔ database thông qua Dirty Checking + Transaction
Start Transaction
↓
Load Entity → vào Persistence Context
↓
Modify Object (Java)
↓
Dirty Checking detect change
↓
Commit Transaction
↓
Flush → Generate SQL → Update DB
Là vùng nhớ do EntityManager quản lý, chứa các entity ở trạng thái managed
Cơ chế Hibernate tự động phát hiện thay đổi của entity
user.setName("Alice");
snapshot = "John"
current = "Alice"
⇒ khác nhau → dirty
UPDATE users SET name = 'Alice' WHERE id = ?
Dirty checking KHÔNG chạy ngay khi set value
Flush = đồng bộ persistence context → database (thực thi SQL)
entityManager.flush()
| Flush | Commit |
| Thực thi SQL | Xác nhận transaction |
| Có thể rollback | Không rollback |
| Chưa ghi vĩnh viễn | Ghi vĩnh viễn |
@Transactional
public void updateUser() {
user.setName("A");
}
user.setName("A"); // không update DB
entityManager.detach(user);
user.setName("A"); // không update
@Transactional
public void updateUsers(List<User> users) {
for (User u : users) {
u.setName("A");
}
}
👉 10k users → 10k update query ❌
@Modifying
@Query("UPDATE User u SET u.name = :name")
entityManager.clear();
Cơ chế Hibernate theo dõi thay đổi entity và tự động update DB khi transaction commit
Đồng bộ persistence context xuống DB bằng SQL nhưng chưa commit
Vì entity managed sẽ được Hibernate tự động update thông qua dirty checking
Khi có nhiều entity trong persistence context → tốn CPU và nhiều query
❌ Không nghĩ: “save để update DB”