Dúvida: Devo ou não continuar meu projeto com a linguagem que escolhi ?
Opa, a minha situação é a seguinte, estou desenvolvendo um projeto web usando Java Spring Boot, JPA e Hibernate, o meu grande problema está sendo em relação ao soft delete que decidi implementar que está me gerando muita dor de cabeça, estou conseguindo deletar registros atribuindo uma data a coluna deleted_at, porém, não estou conseguindo filtrar os registros para que nenhum excluído venha para o meu sistema. A única solução que encontrei para isso é usar o @Where, porém, não quero usa-lo pois sei da dificuldade de trazer os registros deletados para o meu sistema em uma análise de métricas por exemplo.
Já tentei fazer interceptadores de query mas não consegui, nem usando o ChatGPT, nem lendo a documentação do Hibernate.
Estou com esse problema desde que começei a codar o sistema, porém só agora que vi realmente a necessidade de não retornar os registros deletados. Estou considerando mudar a linguagem que estou fazendo meu backend por conta da falta de praticidade do JPA e Hibernate em relação ao soft delete.
Aceito quaisquer sugestões sobre como implementar essa feature ou sobre mudança de linguagem. Agradeço desde já
Olá, Lucas. O tradeoff de utilizar soft delete, é ter que aplicar uma cláusula "where" para filtrar resultados. Posso te garantir que todo ORM que implementa isso, faz exatamente o que você mencionou que não gostaria de fazer. Mesmo que não veja, está por "debaixo dos panos", não se engane. Recomendo seguir com seus planos. Bom trabalho ;)
Sem ver o código fica difícil dar mais detalhes, mas enfim, não consigo ver a dificuldade.
Se não quer trazer os registros deletados, precisa de um WHERE deleted_at IS NULL
. Se quer só os deletados, WHERE deleted_at IS NOT NULL
(ou só os que foram deletados depois de determinada data, WHERE deleted_at > data
e assim por diante). E se quiser todos (deletados e não deletados), não precisa do WHERE
.
Mesmo se mudar de linguagem/framework/lib/ferramenta, vai precisar fazer isso, não tem como escapar. Mas sinceramente, não acho que isso justifica mudar de linguagem. É uma situação relativamente comum, que a maioria dos - senão todos os - frameworks conseguem tratar sem problemas.
Por fim, não sei se é exatamente o seu caso, mas em uma busca rápida encontrei isso, talvez ajude.
Na verdade eu voltaria alguns passos e analisaria se vc precisa mesmo de soft delete. Pois nem sempre é necessário: como tudo em computação, tem prós e contras, então o ideal é primeiro avaliar se precisa mesmo (caso já tenha feito essa análise, pode ignorar este parágrafo).
não quero usa-lo pois sei da dificuldade de trazer os registros deletados para o meu sistema em uma análise de métricas por exemplo
Não trabalho com Java atualmente, mas independente disso não entendi qual seria o problema de usar um where na aplicação. A cláusula where é uma das coisas mais comuns que usamos quando trabalhamos com banco de dados, qual é o problema por trás disso?
Mudar de linguagem
Se você for mudar de linguagem em qualquer dificuldade de arquitetura ou de biblioteca que encontrar, você quase nunca vai conseguir entregar um projeto. Se você está usando ORM e Spring Boot, é bem provável que está fazendo um projeto ao estilo Data Driven, CRUD ou coisa parecida, e nesses casos qualquer linguagem das mais populares vai atender perfeitamente (inclusive Java) o que muda é sua habilidade com ela.
Existem algumas situações em que mudar de linguagem ou reescrever um programa pode fazer sentido, mas pelo que vi da sua pergunta esse não é o caso para o seu projeto.
Isso nao tem nada a ver com o Hibernate. Qualquer ORM será assim
Eu acho que uma solução boa para isso é criar uma VIEW no banco de dadoscom o "where delete is not null" E aí você mapeia no Hibernate essa VIEW e passa a fazer as consultas nela
Pra facilitar, não seria melhor criar um atributo booleano deletado? E ao deletar você setaria ele como True e facilitaria suas buscas?
A assinatura do método no Repository:
public List<Model> findAllByDeletadoFalse();
Ou então, se deleted_at salvar null:
public List<Model> findAllByDeletedAtIsNull();