Nguồn: https://www.tuanh.net/blog/spring/soft-delete-and-application-in-spring-boot
Soft delete là một chiến lược quản lý dữ liệu tránh việc xóa vĩnh viễn các bản ghi. Khi một bản ghi được "soft delete", nó không bị xóa hoàn toàn khỏi cơ sở dữ liệu. Thay vào đó, một trường cụ thể (thường được gọi là cờ "đã xóa" hoặc cờ "is_deleted") được cập nhật để chỉ ra rằng bản ghi không còn hoạt động.
1. Lợi ích của Soft Delete
Khôi Phục Dữ Liệu: Trong trường hợp dữ liệu bị xóa một cách không mong muốn, hệ thống của chúng tôi cho phép phục hồi một cách dễ dàng mà không cần phải quay lại bản sao lưu.
Lịch Sử Dữ Liệu: Bằng cách duy trì một bản ghi đầy đủ về các thay đổi dữ liệu theo thời gian, người dùng có thể thu thập thông tin quý giá về các xu hướng và mẫu dữ liệu.
Tính Toàn Vẹn Dữ Liệu: Hệ thống của chúng tôi được thiết kế để bảo vệ các mối quan hệ giữa các tập dữ liệu khác nhau, đảm bảo rằng việc xóa thông tin từ một khu vực không làm ảnh hưởng đến cấu trúc dữ liệu tổng thể.
2. Triển khai chức năng Soft Delete trong Spring Boot
Để kích hoạt chức năng Soft Delete trong ứng dụng Spring Boot của bạn, hãy làm theo các bước sau:
2.1 Tạo thực thể với trường Soft Delete
Bước đầu tiên là tạo một trường mới trong thực thể của bạn để chỉ ra dữ liệu nào đã bị xóa. Ví dụ:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Column;
import java.time.LocalDateTime; @Entity
@Table(name = "users")
public class User { @Id private Long id; @Column(nullable = false) private String name; @Column(name = "deleted_at") private LocalDateTime deletedAt; // Getters and Setters
}
Trong ví dụ này, trường deletedAt sẽ chứa dấu thời gian khi bản ghi được đánh dấu là đã bị xóa. Nếu trường này là null, bản ghi vẫn còn hợp lệ.
2.2 Tạo một Repository Spring Data JPA với các phương thức truy vấn tùy chỉnh
Để chỉ lấy các bản ghi còn hoạt động, bạn cần điều chỉnh các phương thức trong repository của bạn. Ví dụ:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; public interface UserRepository extends JpaRepository<User, Long> { @Query("SELECT u FROM User u WHERE u.deletedAt IS NULL") List<User> findAllActive(); @Query("SELECT u FROM User u WHERE u.id = :id AND u.deletedAt IS NULL") User findActiveById(@Param("id") Long id);
}
Các phương thức findAllActive() và findActiveById() được thiết kế để chỉ lấy các bản ghi còn hoạt động, loại trừ bất kỳ bản ghi nào đã được đánh dấu để xóa.
2.3 Cập nhật Service để Triển khai Soft Delete
Trong lớp service của bạn, thêm một phương thức để đánh dấu bản ghi là đã bị xóa:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime; @Service
public class UserService { @Autowired private UserRepository userRepository; public void softDelete(Long id) { User user = userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found")); user.setDeletedAt(LocalDateTime.now()); userRepository.save(user); } public List<User> getActiveUsers() { return userRepository.findAllActive(); } public User getActiveUserById(Long id) { return userRepository.findActiveById(id); }
}
3. Kết luận
Soft delete là một cách hiệu quả để quản lý dữ liệu trong các ứng dụng yêu cầu tính toàn vẹn và khả năng phục hồi dữ liệu. Với Spring Boot, việc triển khai soft delete có thể được thực hiện dễ dàng bằng cách thêm một trường cờ, cập nhật repository và service của bạn. Bằng cách làm theo các bước trên, bạn có thể đảm bảo rằng hệ thống của bạn có thể xử lý các yêu cầu quản lý dữ liệu một cách linh hoạt và hiệu quả. Nếu bạn có bất kỳ câu hỏi nào hoặc cần thêm thông tin về việc triển khai soft delete trong Spring Boot, vui lòng để lại bình luận của bạn bên dưới!