Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA软删除存储库+;审计_Java_Spring_Jpa_Spring Data Jpa - Fatal编程技术网

Java JPA软删除存储库+;审计

Java JPA软删除存储库+;审计,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我需要实现JPA软删除存储库并同时支持多个列的JPA审计。 目前,我已经通过EL和@Query+@修改注释实现了软删除存储库: @Override @Modifying @Query("update #{#entityName} e set e.active = false where e.id = ?1") void deleteById(UUID id); @Override default void delete(T entity)

我需要实现JPA软删除存储库并同时支持多个列的JPA审计。 目前,我已经通过EL和@Query+@修改注释实现了软删除存储库:

    @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();
@覆盖
@修改
@查询(“update#{#entityName}e set e.active=false,其中e.id=?1”)
void deleteById(UUID id);
@凌驾
默认无效删除(T实体)
{
deleteById(entity.getId());
}
@凌驾
@修改
@查询(“update#{#entityName}e set e.active=false,其中e.id在?1中”)

void deleteAll(Iterable如果您使用的是Hibernate,那么您可以自定义在remove上执行的SQL,这样它就不会发出delete语句,而是将活动标志设置为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;
}
@SQLDelete(sql=“updatesomeentity SET active=0,其中id=?”,
检查ResultCheckStyle.COUNT)
@实体
公共类实体{
//如果SomeChildEntity具有类似的@SqlDelete子句,则也将被“删除”
@OneToMany(级联=级联类型。移除)
私人儿童;
}
这还有一个额外的优点,即级联删除在使用批量删除时不会按预期执行。

更新: 我决定使用被覆盖的默认删除存储库方法,将活动标志更新为“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);
        }
    }
@覆盖
默认void deleteById(UUID id)
{
Assert.notNull(id,“给定的id不能为null!”);
可选实体=this.findById(id);
实体.ifPresent(此::删除);
}
@凌驾
默认无效删除(T实体)
{
Assert.notNull(实体,“实体不能为null!”);
entity.setActive(Boolean.FALSE);
本.保存(实体);
}
@凌驾

默认void deleteAll(iterable您在哪里读到/了解到@Query不会触发LC回调?好吧,我自己也尝试过,JPA
AuditingEntityListener
和我的自定义审核侦听器都没有被调用(
@PreUpdate
方法)对于上面的delete方法,我在StackOverflow上发现了这个问题:谢谢你的回答。我看到了这个注释,但我没有考虑将它作为一个选项,因为不可能在基
MappedSuperClass
实体上使用这个注释,因为这个注释需要表名。我想我会尝试e删除默认方法,在这里我将更新活动标志列并调用公共保存存储库方法。