1
resposta

Remoção lógica (Soft Delete)

Olá,

estou trabalhando em um modelo de dados que por contrato temos que usar exclusão lógica em algumas tabelas.

Em um cenário bem simples, posso citar como exemplo fictício uma tabela de pessoa física outra tabela de processo e uma tabela que associamos pessoas a processos.

Conheço alguns conceitos e formas de uso, com as anotações @SQLDelete e @Where por exemplo, que me possibilita fazer essa exclusão lógica de maneira simples, assim como a listagem apenas dos registros não excluídos logicamente.

A dúvida mesmo é:

No caso em que só posso "excluir" um registro da tabela "pessoafisica" se não houver nenhum registro de pessoafisica na tabela de associação "pessoafisica_processo" , como faço essa validação? Tenho que fazer essa verificação em minha regra de negócio? O problema é que a cada nova tabela que venha a surgir com esse tipo de relacionamento com a tabela de "pessoafisica", eu vou ter q alterar minha regra de negocio e verificar essa nova relação de integridade.

Enfim como a galera resolve esse problema, que acredito não ser exclusivo de minha aplicação?

1 resposta

Olá Edmilson,

como estão mapeados os seus relacionamentos? Porque se você não passou nenhuma opção de cascade no relacionamento many to many, a JPA por padrão coloca o delete como um relacionamento restrict. Ou seja, caso exista um um registro na tabela associada, ele não apaga o registro de pessoa física. Caso contrário, ele apaga o registro. Então mesmo que sua lógica não faça a verificação, o banco fará o rollback.

De qualquer forma, pode ser interessante sua lógica fazer validações antes de executar alterações no banco se for uma regra de negócio do sistema. Se para o sistema, pessoas físicas com processos não podem ser deletadas, é interessante verificar este cenário antes do delete da pessoa física. Desta forma, tanto na regra de negócio quanto no banco a aplicação fica protegida e as camadas ficam independentes entre si.