«Мягкое» удаление — это когда запись не удаляется физически из базы, а только помечается как удалённая.
При использовании Hibernate вы можете реализовать это сами, а можете использовать трюк с аннотациями @org.hibernate.annotations.SQLDelete и @org.hibernate.annotations.Where.
Аннотация @SqlDelete позволяет задать свой SQL, который будет использоваться при удалении записи с помощью Hibernate.
Аннотация @Where позволяет задать дополнительное условие, которое будет всегда добавляться при выборке данных с помощью Hibernate.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.Where; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import java.util.Objects; import java.util.UUID; @Entity @Table(name = "manager") @SQLDelete(sql="UPDATE driver_partner.manager SET removed = true where id=?") @Where(clause="removed != 'true'") public class Manager { @Id private UUID id; @Column private String name; @Column boolean removed; public UUID getId() { return id; } public void setId(UUID id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isRemoved() { return removed; } public void setRemoved(boolean removed) { this.removed = removed; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Manager manager = (Manager) o; return removed == manager.removed && Objects.equals(id, manager.id) && Objects.equals(name, manager.name); } @Override public int hashCode() { return Objects.hash(id, name, removed); } @Override public String toString() { return "Manager{" + "id=" + id + ", name='" + name + '\'' + ", removed=" + removed + '}'; } } |
Недостаток этого метода в том, что @SqlDelete не использует настройку hibernate.default_schema, поэтому её придётся либо задавать прямо, либо какими-нибудь другими способами.
Недостаток @Where в том, что нет никакого способа его отключить. Вам придётся использовать нативный SQL, если понадобится получить удалённые записи.