Spring Data Rest - 软删除

Posted

技术标签:

【中文标题】Spring Data Rest - 软删除【英文标题】:Spring Data Rest - Soft Delete 【发布时间】:2015-12-07 12:10:50 【问题描述】:

我一直在使用 spring data rest 没有任何问题,但现在我有一个要求,当用户对给定实体(即 DELETE /accounts/<id>)执行 DELETE 操作时,我需要在数据库上设置一个标志,将该实体标记为已删除但我确实想保持记录

基本上这意味着我需要在数据库中执行 UPDATE 而不是 DELETE 操作。我没有找到任何方法来覆盖 delete(ID) 方法的弹簧行为。

一些代码:

@Entity
@Table(name = "account")
public class Account 

    /*
Default value for this field is false but when a receive a 
DELETE request for this entity i want to turn this flag 
to false instead of deleting the record.
    */
    @Column(name = "deleted")
    private boolean deleted;

...

帐户存储库

@RepositoryRestResource
public interface AccountRepository extends JpaRepository<Account, Integer> 


有什么想法吗?

【问题讨论】:

看我的回答:handling-soft-deletes-with-spring-jpa 【参考方案1】:

尝试创建一个自定义存储库,看看效果如何

http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#repositories.custom-implementations

但删除不是您需要更改逻辑的唯一地方。 我看到了两种处理标志要求的方法:

    在您的实体定义中有一个额外的标志,并在删除时更新它。

    在这种情况下,您需要小心并重写所有现有查询,以确保不会返回已删除的实体,并记住这种结果的分离,对于所有未来的实体。 (尽管您可以在低级别破解 SpringData,并自动附加此标志)。

    从原始集合中删除实体并将其添加到另一个集合中,在完全处置之前存储实体。

    在这种情况下,您需要有额外的逻辑来管理处置集合,但这对查询逻辑没有影响。您可以通过将实体侦听器添加到您的 JPA 定义 (http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#jpa.auditing)

    来与现有应用程序集成

【讨论】:

谢谢,我能够在实体中使用注释 @SoftDelete 创建并遵循该春季教程。 (docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/…) 你好 ejoncas,您能否详细说明一下您是如何设置并使用该注释的? 我认为 @SoftDelete 注释尚未被 spring-data-common 发布【参考方案2】:

覆盖@RepositoryRestResourcedelete 方法就足够了,如下所示:

@RepositoryRestResource
public interface ProductRepository extends PagingAndSortingRepository<Product, Long> 

    @Modifying
    @Query("update Product p set deleted = true where p = :p")
    void delete(Product p);

    @Query("select p FROM Product p WHERE p.deleted = false")
    Page<Product> findAll(Pageable pageable);

【讨论】:

【参考方案3】:

我认为首先您应该使用一个界面来仅识别将使用软删除的实体。之后,您可以覆盖删除方法。如果实体是该接口的实例,则将已删除标志设置为 true 并调用更新,否则调用超级实现。使用 SimpleJpaRepository 而不是 JpaRepository。您可以在此处找到接口 https://github.com/danjee/hibernate-mappings 的示例(Persistent 和 DefaultPersistent)

【讨论】:

以上是关于Spring Data Rest - 软删除的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spring Data REST 生成的表示中删除超媒体元素?

《Spring Data JPA从入门到精通》内容简介前言

springelasticsearchdata 性能

是否有适用于 JPA、spring-data、spring-data-rest 的通用 REST 查询语言

Spring-Data-Rest 验证器

排除 Spring-data-rest 资源的部分字段