簡體   English   中英

JPA 軟刪除存儲庫 + 審計

[英]JPA Soft Delete Repository + Auditing

我需要實現 JPA 軟刪除存儲庫並同時支持 JPA 審計多個列。 目前,我已經通過 EL 和 @Query+@Modifying 注釋實現了軟刪除存儲庫:

    @Override
    @Modifying
    @Query("update #{#entityName} e set e.active = false where e.id = ?1")
    void deleteById(UUID id);

    @Override
    default void delete(T entity)
    {
        deleteById(entity.getId());
    }

    @Override
    @Modifying
    @Query("update #{#entityName} e set e.active = false where e.id in ?1")
    void deleteAll(Iterable<? extends T> iterable);

    @Override
    @Modifying
    @Query("update #{#entityName} e set e.active = false")
    void deleteAll();

但是對於這樣的實現,審計列不會更新,因為如果我正確理解, @Query注釋不會觸發任何生命周期回調方法。

@Where實體級別的注釋不是一個選項,因為需要有可能查詢軟刪除的實體。

您能否提供任何其他可能的解決方案?

如果您使用的是 Hibernate,那么您可以自定義在刪除時執行的 SQL,這樣就不會發出刪除語句,而是將活動標志設置為 false。 在這種情況下,您將調用EntityManager#remove (通過 Spring 數據的存儲庫抽象),然后生命周期偵聽器將按預期執行。

@SQLDelete(sql = "UPDATE someEntity SET active= 0 WHERE id = ?", 
                    check ResultCheckStyle.COUNT)
@Entity
public class SomeEntity{

    //if SomeChildEntity has similar @SqlDelete clause then would be 'deleted' also
    @OneToMany(cascade = CascadeType.REMOVE)
    private Set<SomeChildEntity> children;
}

這具有額外的優勢,即級聯刪除也應該按預期執行,而在使用批量刪除時它們不會。

更新:我決定 go 使用覆蓋的默認刪除存儲庫方法將活動標志更新為“false”並通過常見的save()方法保存實體。

    @Override
    default void deleteById(UUID id)
    {
        Assert.notNull(id, "The given id must not be null!");

        Optional<T> entity = this.findById(id);
        entity.ifPresent(this::delete);
    }

    @Override
    default void delete(T entity)
    {
        Assert.notNull(entity, "The entity must not be null!");

        entity.setActive(Boolean.FALSE);
        this.save(entity);
    }

    @Override
    default void deleteAll(Iterable<? extends T> entities)
    {
        Assert.notNull(entities, "The given Iterable of entities must not be null!");

        for (T entity : entities)
        {
            this.delete(entity);
        }
    }

    @Override
    default void deleteAll()
    {
        for (T element : this.findAll())
        {
            this.delete(element);
        }
    }

暫無
暫無

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

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