簡體   English   中英

Spring 數據 Rest - 軟刪除

[英]Spring Data Rest - Soft Delete

我一直在使用 spring 數據 rest 沒有任何問題但現在我有一個要求,當用戶對給定實體執行 DELETE 操作時,即DELETE /accounts/<id>我需要在數據庫上設置一個標志將該實體標記為已刪除,但我確實想保留記錄

基本上這意味着我需要在數據庫中執行更新而不是刪除操作。 我找不到任何方法來覆蓋 delete(ID) 方法的 spring 行為。

一些代碼:

@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> {

}

有任何想法嗎?

嘗試創建一個自定義存儲庫,看看它會如何發揮作用

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 )與現有應用程序集成

覆蓋@RepositoryRestResource delete方法就足夠了,如下所示:

@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);
}

我認為首先您應該使用一個界面來僅識別將使用軟刪除的實體。 之后,您可以覆蓋刪除方法。 如果實體是該接口的實例,則將刪除的標志設置為 true 並調用更新,否則調用超級實現。 使用 SimpleJpaRepository 而不是 JpaRepository。 您可以在此處找到接口https://github.com/danjee/hibernate-mappings 的示例(Persistent 和 DefaultPersistent)

@Autowired
private AccountRepository accountRepository; 
@Override
   public void accountSoftDelete (Long id) {
        Optional<Account> account1= accountRepository.findById(id);
        account1.get().setDeleted(true);
        accountRepository.save(account1.get());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM