Executando verificação de segurança...
5

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);
}
    
Carregando publicação patrocinada...
2

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