Bir entity için entityRepo.delete() metodunu çağırdığımız zaman arkada normal olarak delete from ..... komutu çalışıyor. JPA kullanırken delete komutunun davranışını değiştirebiliyoruz.
Bunun için şöyle birşey yapmamız gerekiyor.
@SQLDelete(sql = "update CAM_RULE set deleted_at=sysdate WHERE id = ?")
public class Entitim {
...
@Column(name = "deleted_at")
private deletedAt;
}
Burda gördüğümüz @SQLDelete annotation delete metodunun öntanımlı davranışını değiştiriyor ve entitimRepo.delete(entitim) çağırdığımız zaman bu sql kodu çalışıyor.
Buraya kadar güzel. Bundan sonra entitimRepo.findAll() dediğimiz zaman bu deletedAt kolonu dolu olanların gelmemesini istiyoruz. Keza bizim için artık silindiler anlamına geliyor. Bunun için aşağıdaki gibi bir kod parçası eklediğimiz zaman otomatik olarak bütün sorgularımızı bu sorgu eklenerek çağıracaktır.
@SQLDelete(sql = "update CAM_RULE set deleted_at=sysdate WHERE id = ?")
@Where(clause = "deleted_at is null")
public class Entitim {
...
@Column(name = "deleted_at")
private deletedAt;
}
@Where annotation ile bir sorgunun where kısmına eklenilecek kod parçasını yazıyoruz. Bunu yazdığımız zaman çalıştırılan jpa'nın yönettiği bütün sorgulara (native query hariç) bu kod parçasını ekleyecektir. Bu durumda da deleted_at kolonu null olan kayıtlar her zaman geleceği için soft delete işlemini gerçekleştirmiş olacaktır.