gpt4 book ai didi

java - JPA 软删除存储库 + 审核

转载 作者:行者123 更新时间:2023-11-30 05:27:14 29 4
gpt4 key购买 nike

我需要实现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,以便将 Activity 标志设置为 false,而不是发出删除语句。在这种情况下,您将调用 EntityManager#remove(通过 Spring Data 的存储库抽象),然后生命周期监听器将按预期执行。

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

这还有一个额外的优点,即级联删除也应该按预期执行,而在使用批量删除时却不会按预期执行。

关于java - JPA 软删除存储库 + 审核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58289970/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com