Java.Hibernate.Medium.How do you implement soft deletes in Hibernate?

Short Answer

In Hibernate, you implement soft deletes by adding a field (e.g., deleted, active) to your entity and using either:
✅ A query filter (@SQLDelete + @Where), or
✅ Manual query conditions,
so the entity is marked as deleted instead of physically removed from the database.

🔎 Detailed Explanation

🔹 What’s a soft delete?
Instead of removing a row with DELETE FROM table, you mark it as deleted (e.g., deleted=true) → preserving the data for audits, recovery, or compliance.


🔹 Basic entity example

@Entity
public class User {
    @Id
    private Long id;

    private String name;

    private boolean deleted = false;
}

🔹 Manual approach (simplest)
You avoid calling entityManager.remove(), and instead set deleted=true:

✅ But you must remember to filter deleted=false in every query → error-prone.

🔹 Hibernate-native soft deletes (recommended)
Use @SQLDelete + @Where for automatic soft deletes without modifying every query:

@SQLDelete: tells Hibernate what SQL to run instead of DELETE.
@Where: applies a filter clause automatically to all queries.

Example:

@Entity
@SQLDelete(sql = "UPDATE user SET deleted = true WHERE id = ?")
@Where(clause = "deleted = false")
public class User {
    @Id
    private Long id;

    private String name;

    private boolean deleted = false;
}

✅ Now:

  • entityManager.remove(user) → executes UPDATE user SET deleted=true WHERE id=?
  • Queries like entityManager.find(User.class, id) automatically add WHERE deleted=false.

🔹 Key points with @SQLDelete/@Where
✅ Data stays in the database → you can restore by flipping deleted=false.
✅ Avoids accidentally showing deleted records → @Where ensures deleted entities are excluded from standard reads.
✅ Works seamlessly with Session.delete() / EntityManager.remove() → no changes in service code.

Limitation: @Where only works on entity queries → if you use native SQL or JPQL without deleted=false, you must manually add the condition.

🔹 Optional: add indexing
If you use soft deletes extensively, index the deleted column to avoid performance issues:

CREATE INDEX idx_user_deleted ON user (deleted);

📌 Key Takeaways

✅ Soft deletes let you mark data as inactive without physically removing it → preserves data integrity and audit trails.
✅ Hibernate’s @SQLDelete + @Where combo makes soft deletes transparent to your app code.
✅ Always remember: soft-deleted data still exists → plan carefully for security and storage concerns.

This entry was posted in Без рубрики. Bookmark the permalink.

Leave a Reply

Your email address will not be published.