MrJazsohanisharma

Implementing Soft Delete in JPA Entities

Implementing Soft Delete in JPA Entities: Best Practices and Real Use Cases

Soft delete is a technique used in database operations where records are not physically deleted but instead marked as deleted using a flag. This approach ensures data integrity, facilitates auditing, and helps in compliance with business requirements. In this blog post, we’ll dive into implementing soft delete in JPA entities, explore real-world use cases, and discuss best practices. 

Implementing Soft Delete in JPA Entities


Why Soft Delete Instead of Hard Delete?

  • Data Retention and Auditing – You can keep historical records for future reference.
  • Accidental Deletion Prevention – Users can deleted data.
  • Business Compliance – Certain regulations require data to be stored for a fixed period before actual deletion.
  • Avoiding Broken Relationships – Deleting an entity could cause orphaned records due to foreign key constraints.

Implementing Soft Delete in JPA

Using a `deleted` Flag in the Entity

@Entity

@Table(name = "users")

@SQLDelete(sql = "UPDATE users SET deleted = true WHERE id = ?")

@Where(clause = "deleted = false")

public class User {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;

    private String name;

    private String email;

    private boolean deleted = false; // Soft delete flag

    // Getters and Setters

}




Soft Delete in Spring Data JPA Repository

public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.deleted = false")

    List<User> findAllActiveUsers();

}




Real Use Cases of Soft Delete

  • E-commerce Systems – Products and orders need to be retained for reporting purposes even if marked deleted.
  • Content Management Platforms – Articles, blog posts, and comments should be archived rather than permanently removed.
  • HR & Employee Management – Employee records shouldn't be erased immediately due to legal and compliance reasons.

Best Practices for Implementing Soft Delete

  • Use `@Where` for Global Filtering – Ensures soft-deleted records don’t appear in queries.
  • Create a Separate Audit Table – Helps maintain data integrity while allowing restoration.
  • Schedule Cleanup Jobs – Use scheduled tasks to permanently delete old soft-deleted records after a retention period.
  • Handle Soft Delete for Related Entities – Ensure relationships are handled properly to prevent orphaned data.

End-to-End Example with Spring Boot, REST API, JPA, and H2

Spring Boot Application Setup

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-jpa</artifactId>

    </dependency>

    <dependency>

        <groupId>com.h2database</groupId>

        <artifactId>h2</artifactId>

        <scope>runtime</scope>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

</dependencies>




Entity Class

@Entity

@Table(name = "users")

@SQLDelete(sql = "UPDATE users SET deleted = true WHERE id = ?")

@Where(clause = "deleted = false")

public class User {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;

    private String name;

    private String email;

    private boolean deleted = false;

    // Constructors, Getters, and Setters

}




Repository Interface

public interface UserRepository extends JpaRepository<User, Long> {

    List<User> findByDeletedFalse();

}




Service Layer

@Service

public class UserService {

    @Autowired

    private UserRepository userRepository;

    public List<User> getActiveUsers() {

        return userRepository.findByDeletedFalse();

    }

    public User createUser(User user) {

        return userRepository.save(user);

    }

    public void deleteUser(Long id) {

        userRepository.deleteById(id);

    }

}




Controller Layer

@RestController

@RequestMapping("/users")

public class UserController {

    @Autowired

    private UserService userService;

    @GetMapping

    public List<User> getUsers() {

        return userService.getActiveUsers();

    }

    @PostMapping

    public User createUser(@RequestBody User user) {

        return userService.createUser(user);

    }

    @DeleteMapping("/{id}")

    public void deleteUser(@PathVariable Long id) {

        userService.deleteUser(id);

    }

}




Conclusion

Soft delete is an efficient way to manage records without losing valuable data. By using Hibernate’s `@SQLDelete` and `@Where` annotations, along with proper repository methods, you can implement soft delete seamlessly in Spring Boot applications. Adopting best practices will ensure better performance and maintainability in large-scale systems.

--- This should work perfectly for embedding inside another HTML page or using in a markdown editor! Let me know if you need any modifications. 🚀
Previous Post Next Post

Blog ads

ads