前言
在业务中是忌讳物理删除数据的,数据的这个对于一个IT公司可以说是最核心的资产,如果删除直接就物理删除,无疑是对核心资产的不重视,可能扯的比较远,本文最主要是想通过spring jpa data实现逻辑删除。
在日常开发中我们可以方便的通过findXxx等增查改数据,但是如果直接使用deleteXxx的话,数据是直接从数据库删除的,这是我们不想要的,我们数据库中设计了is_del字段话,默认0是未删除,1是删除,如果在删除的时候,希望是只是一个update的动作,把is_del改成1。
当然你可以在删除的时候,重写dao删除的操作,通过传入的删除id值,查询需要删除的实体,然后通过Update操作进行逻辑操作,这样是可行的,不过jpa data提供了一个更优雅的操作方式。
开始
jpa data提供了一个注解@SQLDelete,可以在操作的实体上注解,定义注解属性sql,sql就是一个update语句,具体可以看下面这个实体类:
@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的方法:
@Transactional public void deleteScoreHis(String scoreHisId){ scoreHisDao.delete(scoreHisId); ....省略代码 }
上述操作执行后,库中的IS_DEL字段变成了1,成功的实现了逻辑删除的操作。
总结
spring jpa data让dao层的写法轻松了很多,但是一些比较深层的使用,有待一步步挖掘(比如动态条件查询,现在写起来还是挺麻烦),但是我觉得可以很好的替代hibernate,毕竟是对hibernate的封装。