Если вы используете Hibernate, то вы можете настроить 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;
}
Это имеет дополнительное преимущество, заключающееся в том, что каскадное удаление также должно выполняться, как и ожидалось, когда не выполнялось массовое удаление.