[英]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.