Soft delete com Spring Boot
Alguma ideia de cascatear delete utilizando soft delete com Spring Boot? Mais especificamente em uma relação unidirecional ManyToOne
Alguma ideia de cascatear delete utilizando soft delete com Spring Boot? Mais especificamente em uma relação unidirecional ManyToOne
Parece ser o mesmo problema relatado pelo colega axxterisco em outra publicação:
https://www.tabnews.com.br/axxterisco/duvida-relacoes-no-spring-boot
Pesquisando um pouco, parece que não há como "cascadear" o on delete quando se usa o soft delete no spring boot.
Um dos exemplos que encontrei, é realizar o seguinte procedimento:
Classes e relacionamentos:
@SQLDelete("UPDATE User SET deleted = TRUE WHERE id = ?")
@Where(clause = "deleted = FALSE")
public class User {
@OneToMany(mappedBy = "user", fetch = EAGER, cascade=ALL, orphanRemoval = true)
private List usernotes;
}
@SQLDelete("UPDATE Note SET deleted = TRUE WHERE id = ?")
@Where(clause = "deleted = FALSE")
public class Note { }
Construir o seguinte sql:
public interface NotesRepository extends JpaRepository {
@Query("UPDATE Notes n SET n.deleted = TRUE WHERE n.user.id = :id")
public void deleteByUserId(Long id);
}
e ao chamar o service para realizar uma exclusão, também chamar o sql que construimos acima:
public void deleteUser(Long userId) {
User user = userrepo.deleteById(userId);
noteRepo.deleteByUserId(userId);
}
Massa, obrigado pela ajuda! Seguindo o seu exemplo, pensei em utilizar um listener na classe user, para que todas as classes associadas à ele sejam deletadas antes de sua exclusão. Ficaria mais ou menos assim:
@EntityListeners(UserListener.class)
@SQLDelete("UPDATE User SET deleted = TRUE WHERE id = ?")
@Where(clause = "deleted = FALSE")
public class User {
@OneToMany(mappedBy = "user", fetch = EAGER, cascade=ALL, orphanRemoval = true)
private List usernotes;
}
public class UserListener {
@PreRemove
private void beforeDelete(User user) {
noteRepo.deleteByUserId(user.getId());
}
}
Assim, o método de deletar um usuário não fica poluído com vários repositórios ou serviços sendo chamados