Spring Data Rest - 软删除

ejo*_*cas 8 java rest spring spring-data spring-data-rest

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

基本上这意味着我需要在数据库中执行UPDATE而不是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;

...
}
Run Code Online (Sandbox Code Playgroud)

帐户存储库

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

}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

mav*_*azy 6

尝试创建一个自定义存储库,看看它会如何发挥作用

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

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

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

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

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

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

  • 您好 ejoncas,您能否详细说明如何设置该注释并使用它? (2认同)
  • 我认为 @SoftDelete 注释尚未被 spring-data-common 发布 (2认同)