spring data jpa 实现逻辑删除

由于最近正在做一个开源的微服务系统。采用spring cloud, spring boot, axon 等等来做。然后呢。ORM打算采用的是spring data jpa。然后再做系统的时候就考虑到了一个持久化逻辑删除的问题。那么问题来了。spring data jpa并不支持逻辑删除。在网上找了很多以后。发现有个同学是这样做的。自己写一个BaseDao然后BaseDao继承PagingAndSortingRepository 这个类。再自己对BaseDao写一个实现。把SimpleJpaRepository 代码复制过来。再将里面的查询语句进行修改。同时实现逻辑删除的代码。原文链接如下。

http://someok.iteye.com/blog/1616651

感兴趣的同学可以去自行研究一下。刚开始我也觉得。这就是我想要的。但是写了之后。一直报错。找不到自定义的那几个逻辑删除属性。原来是自己写的实现没有生效。这让我很忧伤啊。然后继续逛,看到一个这样的方案。

@Entity
@Table(name="demo")
@SQLDelete(sql = "update demo set deleted = 1 where id = ?")
@Where(clause = "deleted = 0")
public class Demo{

    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="deleted")
    private Integer deleted = 0;

    private String userName;

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getDeleted() {
        return deleted;
    }

    public void setDeleted(Integer deleted) {
        this.deleted = deleted;
    }
}

作者:scipio
链接:http://www.jianshu.com/p/398b2fda1bb0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这玩意儿乍一看很美好。但是实际不然。这样做将所有的删除方法都覆盖了。当我想要用到物理删除的时候。就不能用了。于是再次出发。寻找一种更加美妙的解决方案。终于让我找到了。话不多说。直接放码。

@NoRepositoryBean
public interface BaseDao<T extends BaseEntry, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {

    @Override
    @Transactional(readOnly = true)
    @Query("select e from #{#entityName} e where e.deleted = false")
    List<T> findAll();

    @Override
    @Transactional(readOnly = true)
    @Query("select e from #{#entityName} e where e.id in ?1 and e.deleted = false")
    Iterable<T> findAll(Iterable<ID> ids);

    @Override
    @Transactional(readOnly = true)
    @Query("select e from #{#entityName} e where e.id = ?1 and e.deleted = false")
    T findOne(ID id);

    @Override
    @Transactional(readOnly = true)
    @Query("select count(e) from #{#entityName} e where e.deleted = false")
    long count();

    @Override
    @Transactional(readOnly = true)
    default boolean exists(ID id) {
        return findOne(id) != null;
    }

    @Query("update #{#entityName} e set e.deleted = true where e.id = ?1")
    @Transactional
    @Modifying
    void logicDelete(ID id);

    @Transactional
    default void logicDelete(T entity) {
        logicDelete((ID) entity.getId());
    }

    @Transactional
    default void logicDelete(Iterable<? extends T> entities) {
        entities.forEach(entity -> logicDelete((ID) entity.getId()));
    }

    @Query("update #{#entityName} e set e.deleted = true ")
    @Transactional
    @Modifying
    void logicDeleteAll();
}

BaseEntry代码如下:

@Data
@MappedSuperclass
public class BaseEntry implements Serializable {

    private static final long serialVersionUID = 5966306766659220492L;

    @Id
    protected String id;

    @Temporal(TemporalType.TIMESTAMP)
    protected Date createdDate;

    protected String createdBy;

    @Temporal(TemporalType.TIMESTAMP)
    protected Date updatedDate;

    protected String updatedBy;

    protected Boolean deleted = false;
}

这样一来。代码就瞬间清爽了。哈哈~

转载于:https://my.oschina.net/weechang93/blog/1576594

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值