在业务中是忌讳物理删除数据的,数据的这个对于一个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的封装。开发