✅ 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)
→ executesUPDATE user SET deleted=true WHERE id=?
- Queries like
entityManager.find(User.class, id)
automatically addWHERE 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.