在業務中是忌諱物理刪除數據的,數據的這個對於一個IT公司能夠說是最核心的資產,若是刪除直接就物理刪除,無疑是對核心資產的不重視,可能扯的比較遠,本文最主要是想經過spring jpa data實現邏輯刪除。spring
在平常開發中咱們能夠方便的經過findXxx等增查改數據,可是若是直接使用deleteXxx的話,數據是直接從數據庫刪除的,這是咱們不想要的,咱們數據庫中設計了is_del字段話,默認0是未刪除,1是刪除,若是在刪除的時候,但願是隻是一個update的動做,把is_del改爲1。sql
固然你能夠在刪除的時候,重寫dao刪除的操做,經過傳入的刪除id值,查詢須要刪除的實體,而後經過Update操做進行邏輯操做,這樣是可行的,不過jpa data提供了一個更優雅的操做方式。數據庫
jpa data提供了一個註解@SQLDelete,能夠在操做的實體上註解,定義註解屬性sql,sql就是一個update語句,具體能夠看下面這個實體類:spa
@Data @Accessors(chain = true) @Entity @Table(name = "SCORE_HIS") @SQLDelete(sql = "update SCORE_HIS set IS_DEL = 1 where HIS_ID = ?") @Where(clause = "IS_DEL = 0") public class ScoreHis { @Id @Column(name = "HIS_ID") private String hisId; ..... @Type(type = "org.hibernate.type.NumericBooleanType") @Column(name = "IS_DEL") private boolean isDel = false; }
在實體類中註解了@SQLDelete,而且使用@Where註解,對查詢進行時候必須是沒有被刪除的,在查詢的時候會在條件裏面加上註解中的未刪除條件,在下面這行代碼中調用delete的方法:hibernate
@Transactional public void deleteScoreHis(String scoreHisId){ scoreHisDao.delete(scoreHisId); ....省略代碼 }
上述操做執行後,庫中的IS_DEL字段變成了1,成功的實現了邏輯刪除的操做。設計
spring jpa data讓dao層的寫法輕鬆了不少,可是一些比較深層的使用,有待一步步挖掘(好比動態條件查詢,如今寫起來仍是挺麻煩),可是我以爲能夠很好的替代hibernate,畢竟是對hibernate的封裝。開發