Tem como fazer exclusão lógica automática com JPA ou Hibernate?  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
gigicantador
Debugger
[Avatar]

Membro desde: 06/03/2007 11:35:12
Mensagens: 53
Offline

Estrou procurando uma forma de fazer xclusão lógica usando JPA. Alguém sabe se existe alguma annotation ou vou ter que adicionar um campo em todas as minhas queries em que eu quiser recuperar apenas os "não excluídos"?

Por exemplo:


Se houver um meio de eu indicar apra o hibernate que o campo excluido é o campo de exclusão lógica, não preciso colocar "WHERE excluido = false" em todas as minhas queries

"Always code as if the person who will maintain your code is a maniac serial killer that knows where you live"
Lavieri
GUJ Master
[Avatar]

Membro desde: 27/01/2004 13:39:31
Mensagens: 1851
Localização: João Pessoa / PB
Offline

YES! you can!

Todas as Pessoas, através de AbstractPessoa


Apenas as Pessoas Excluidas, através de PessoaExcluida


Apenas as Pessoas não ecluidas, através de Pessoa...



pronto... assim vc consegue relacionar com Pessoa, que é uma entidade que contem apenas os itens não excluidos...

This message was edited 2 times. Last update was at 11/08/2009 19:48:55


Sun Certified Java Programmer (SCJP 6)

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999

Meu blog -> http://blog.tomazlavieri.com.br/
[ICQ]
gigicantador
Debugger
[Avatar]

Membro desde: 06/03/2007 11:35:12
Mensagens: 53
Offline

Valeu MESMO! Vou tentar isso, mas tem cara de que resolve os meus problemas.

Se não rolar dou um feed back aqui no fórum.

"Always code as if the person who will maintain your code is a maniac serial killer that knows where you live"
gigicantador
Debugger
[Avatar]

Membro desde: 06/03/2007 11:35:12
Mensagens: 53
Offline

Só dando um feed back...

A herança não rolou. Tenho muitas entidades no meu sistema e ia ficar inviável triplicá-las só para conseguir fazer a exclusão lógica de forma automática.
Em vez disso encontramos uma annotation do hibernate que facilita as coisas. É a @Where (http://docs.jboss.org/hibernate/stable/annotations/api/org/hibernate/annotations/Where.html) Com ela conseguimos colocar uma cláusula em todas as queries feitas. Outra annotation é a @SQLDelete. Sempre que eu chamar o remove a exclusão será feita de acordo com a regra que eu criar. Por exemplo:




Abraços!

"Always code as if the person who will maintain your code is a maniac serial killer that knows where you live"
bbmany
JavaTeenager
[Avatar]

Membro desde: 04/12/2007 17:23:24
Mensagens: 188
Offline

Olá gigicantador
O seu método de busca/atualização/remoção precisa fazer alguma referência à anotação @Where???
Para ilustrar, este método abaixo retornaria somente as pessoas que não foram excluídas???

Aguardo, enquanto isso vou testar aqui

- Brena Monteiro -
Pós-graduanda em Engenharia de Software
Bacharel em Sistemas de Informação.
Tecnóloga em Análise e Desenvolvimento de Sistemas.
Analista e desenvolvedora de sistemas web.

monteirobrena.wordpress.com

Twitter
[WWW]
bbmany
JavaTeenager
[Avatar]

Membro desde: 04/12/2007 17:23:24
Mensagens: 188
Offline

Então, respondendo à minha pergunta: Basta acrescentar a anotação @Where e criar um atributo ao qual ela irá se referir
Fica assim:

Dessa forma quando você buscar todas as pessoas ele irá retornar somente as que tiverem ativo igual a 1!!!

- Brena Monteiro -
Pós-graduanda em Engenharia de Software
Bacharel em Sistemas de Informação.
Tecnóloga em Análise e Desenvolvimento de Sistemas.
Analista e desenvolvedora de sistemas web.

monteirobrena.wordpress.com

Twitter
[WWW]
tiagomac
JavaTeenager
[Avatar]

Membro desde: 15/12/2006 05:38:29
Mensagens: 191
Localização: Salvador, BA
Offline

E usando a anotação @Where, se eu desejar através do hibernate retornar todos os objetos que foram removidos por ex. (ativo = 0) ???

Estou com esse problema no momento, desenvolvemos um sistema com o @Where, mas chegou em um ponto em que foi preciso recuperar todos aqueles que estivessem com o ativo = 0...para realizar auditoria... e então, alguém sabe como fazer isso? como dar 1 bypass no @Where???

Abraços!!

scjp 6
ocpjwcd 5

"Desconfie do destino e acredite em você. Gaste mais horas realizando que sonhando, fazendo que planejando, vivendo que esperando, porque embora quem quase morre esteja vivo, quem quase vive já morreu" - Luiz Fernando Veríssimo - Cronista e escritor.
[MSN]
bbmany
JavaTeenager
[Avatar]

Membro desde: 04/12/2007 17:23:24
Mensagens: 188
Offline

Falando por alto sem testar:
Já tentou recuperar no banco com uma query que selecione todos com "ativo=0"???
Vou tentar achar uma solução aqui.
Inté

- Brena Monteiro -
Pós-graduanda em Engenharia de Software
Bacharel em Sistemas de Informação.
Tecnóloga em Análise e Desenvolvimento de Sistemas.
Analista e desenvolvedora de sistemas web.

monteirobrena.wordpress.com

Twitter
[WWW]
tiagomac
JavaTeenager
[Avatar]

Membro desde: 15/12/2006 05:38:29
Mensagens: 191
Localização: Salvador, BA
Offline

bbmany wrote:Falando por alto sem testar:
Já tentou recuperar no banco com uma query que selecione todos com "ativo=0"???
Vou tentar achar uma solução aqui.
Inté


Testado... também não funcionou, tentei também "where active = 0 or active = 1" e também não funcionou ! parece que ele só retorna o que tiver o active = 1... já usei também diretamente "where active = 0" e não retorna nada :O!!

Mais alguma idéia? eu posso testar aqui... preciso de uma solução para isso, já rodei o google todo, não encontro nada... !

scjp 6
ocpjwcd 5

"Desconfie do destino e acredite em você. Gaste mais horas realizando que sonhando, fazendo que planejando, vivendo que esperando, porque embora quem quase morre esteja vivo, quem quase vive já morreu" - Luiz Fernando Veríssimo - Cronista e escritor.
[MSN]
bbmany
JavaTeenager
[Avatar]

Membro desde: 04/12/2007 17:23:24
Mensagens: 188
Offline

Também testei e nada ainda.
Estou pesquisando, se achar algo eu posto
Inté

- Brena Monteiro -
Pós-graduanda em Engenharia de Software
Bacharel em Sistemas de Informação.
Tecnóloga em Análise e Desenvolvimento de Sistemas.
Analista e desenvolvedora de sistemas web.

monteirobrena.wordpress.com

Twitter
[WWW]
bbmany
JavaTeenager
[Avatar]

Membro desde: 04/12/2007 17:23:24
Mensagens: 188
Offline

Nada ainda???
Estou quebrando cabeça aqui...
Implementei a exclusão lógica do Hibernate, mas não está ajudando pois pra salvar o próximo registro eu pego o código do último e continuo a sequência, sendo que este código é único.
Entretanto com a exclusão lógica a busca traz o valor do último cadastrado não excluído. Então ele tenta salvar com o próximo valor e dá erro de chave duplicada...
Alguém ai sabe como resolver???

- Brena Monteiro -
Pós-graduanda em Engenharia de Software
Bacharel em Sistemas de Informação.
Tecnóloga em Análise e Desenvolvimento de Sistemas.
Analista e desenvolvedora de sistemas web.

monteirobrena.wordpress.com

Twitter
[WWW]
tiagomac
JavaTeenager
[Avatar]

Membro desde: 15/12/2006 05:38:29
Mensagens: 191
Localização: Salvador, BA
Offline

bbmany wrote:Nada ainda???
Estou quebrando cabeça aqui...
Implementei a exclusão lógica do Hibernate, mas não está ajudando pois pra salvar o próximo registro eu pego o código do último e continuo a sequência, sendo que este código é único.
Entretanto com a exclusão lógica a busca traz o valor do último cadastrado não excluído. Então ele tenta salvar com o próximo valor e dá erro de chave duplicada...
Alguém ai sabe como resolver???


Então, isso aqui no projeto estava gerando uma grande dor de cabeça, tentamos entrar em contato até com o criador dessa anotação, o Emmanuel Bernard, autor do livro Hibernate Search in Action... mas não obtive retorno... em conversa com um arquiteto nosso ele me disse que era impossível fazer um bypass no @Where ! que havia saido um artigo recente sobre isso e que no próprio artigo mencionava o cuidado no uso por conta disso...

A solução que usamos foi retirar o @Where diretamente das classes, passamos o "where active = 1" para as buscas (dentro dos DAOs), no entanto algumas casses tem relação N-M então nesses atributos o @Where entrou diretamente no atributo...

Bom, isso resolveu o problema por aqui, não foi de modo elegante... infelizmente ! mas durante a pesquisa eu vi até um framework que não recordo o nome agora e que faz esse tipo de auditoria, replicando as classes no banco, no entanto ele só funciona em um contexto JPA, diferente do hibernate... um pouco mais complicada a implementação então optamos por algo mais manual...

Abraços!!!

scjp 6
ocpjwcd 5

"Desconfie do destino e acredite em você. Gaste mais horas realizando que sonhando, fazendo que planejando, vivendo que esperando, porque embora quem quase morre esteja vivo, quem quase vive já morreu" - Luiz Fernando Veríssimo - Cronista e escritor.
[MSN]
bbmany
JavaTeenager
[Avatar]

Membro desde: 04/12/2007 17:23:24
Mensagens: 188
Offline

Valeu tiagomac
Era o que eu estava pensando em fazer porque pelo Hibernate não encontrei um jeito para "ignorar" a anotação em determinadas buscas.
Vou implementar sua solução e qualquer dúvida posto aqui.
Obrigada.

- Brena Monteiro -
Pós-graduanda em Engenharia de Software
Bacharel em Sistemas de Informação.
Tecnóloga em Análise e Desenvolvimento de Sistemas.
Analista e desenvolvedora de sistemas web.

monteirobrena.wordpress.com

Twitter
[WWW]
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team