Auditing_And_Event Listeners
1. Spring Data JPA Auditing
Spring Data JPA Auditing giúp tự động theo dõi các thay đổi trên Entity, như người tạo, người sửa, ngày tạo, ngày sửa.
🔹 Kích hoạt Spring Auditing
Để sử dụng Spring Auditing, bạn cần kích hoạt bằng @EnableJpaAuditing
:
🔹 Các Annotation Auditing
Spring hỗ trợ 4 annotation chính:
@CreatedBy
Lưu lại người tạo record.
@LastModifiedBy
Lưu lại người sửa record gần nhất.
@CreatedDate
Lưu ngày tạo record.
@LastModifiedDate
Lưu ngày cập nhật gần nhất.
🔹 Ví dụ: Entity có Audit
🔹 Cấu hình AuditorAware
AuditorAware
AuditorAware
giúp lấy thông tin người dùng hiện tại để điền vào @CreatedBy
& @LastModifiedBy
.
🔹 Khai báo AuditorAware
trong cấu hình:
2. Hibernate Interceptor vs. Spring Auditing
Mức độ hoạt động
Toàn bộ Hibernate
Chỉ áp dụng cho Entity
Lắng nghe sự kiện
Trước/sau INSERT, UPDATE, DELETE
Chỉ hỗ trợ CREATED, MODIFIED
Hiệu suất
Nặng hơn
Nhẹ hơn
Dùng khi nào?
Khi cần can thiệp sâu vào Hibernate
Khi chỉ cần tracking audit
🔹 Khi nào dùng Hibernate Interceptor?
Khi cần thay đổi dữ liệu toàn cục trước khi Hibernate thực hiện INSERT/UPDATE.
Khi cần ghi log tất cả thao tác trên DB, không chỉ các trường
@CreatedBy
,@LastModifiedDate
.
3. Application Events & Entity Listeners
Spring hỗ trợ 2 cách để lắng nghe sự kiện thay đổi Entity:
Spring Events (
ApplicationEventPublisher
) → Lắng nghe sự kiện toàn ứng dụng.JPA Entity Listeners (
@EntityListeners
) → Lắng nghe thay đổi của từng Entity.
🔹 Spring Events (ApplicationEventPublisher
)
ApplicationEventPublisher
)Spring Events giúp phát và lắng nghe sự kiện mà không bị ràng buộc vào Entity cụ thể.
🔹 Định nghĩa sự kiện
🔹 Phát sự kiện khi tạo Product
🔹 Lắng nghe sự kiện
🔹 Entity Listeners (@EntityListeners
)
@EntityListeners
)Entity Listener gắn trực tiếp vào Entity và chạy trước/sau các sự kiện của Hibernate.
🔹 Định nghĩa Listener
🔹 Áp dụng Listener vào Entity
4. So sánh @EntityListeners và Spring Events
Tiêu chí
@EntityListeners
Spring Events (ApplicationEventPublisher
)
Mức độ hoạt động
Chỉ với Entity cụ thể
Toàn bộ ứng dụng
Hỗ trợ sự kiện nào?
@PrePersist
, @PostPersist
, @PreUpdate
Tùy chỉnh sự kiện
Hiệu suất
Cao hơn vì gắn với Hibernate
Thấp hơn vì chạy trong Spring Context
Khi nào nên dùng?
Khi cần kiểm soát logic ngay trên Entity
Khi cần xử lý tác vụ khác như gửi email
Last updated