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:
@Entity
@Table(name = "pessoa")
public class Pessoa implements java.io.Serializable {
private Integer id;
private String nome;
private Boolean excluido;
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
@Entity
@Table(name = "pessoa")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) //ou seja, herança dentro da mesma tabela
@DescriminatorColumn(name="excluido", DiscriminatorType.INTEGER) //O campo que define a herença se chama exlcluido, e é definido por um integer
public class AbstractPessoa implements java.io.Serializable {
private Integer id;
private String nome;
private Boolean excluido;
}
Apenas as Pessoas Excluidas, através de PessoaExcluida
[code]@Entity @DescriminatorValue(value=1) //interger = 1 é o mesmo que boolean = true
public class PessoaExcluida extends AbstractPessoa {
}[/code]
Apenas as Pessoas não ecluidas, através de Pessoa…
[code]@Entity @DescriminatorValue(value=0) //interger = 0 é o mesmo que boolean = false
public class Pessoa extends AbstractPessoa {
}[/code]
pronto… assim vc consegue relacionar com Pessoa, que é uma entidade que contem apenas os itens não excluidos…
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:
@Entity
@Table(name = "pessoa")
@Where(clause = "ativo" = 1")
@SQLDelete(sql = "UPDATE pessoa SET ativo = 0 WHERE id = ?")
@SQLDeleteAll(sql = "UPDATE pessoa SET ativo = 0")
public class Pessoa implements Serializable {
...
}
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???
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???
[quote=bbmany]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é ;)[/quote]
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… :(!
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???
[quote=bbmany]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???[/quote]
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…
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.