Hibernate: trocar delete por update

10 respostas
J2Alex

Olá,

Tem como interceptar um delete no hibernate e trocar por um update? E isso deverá ocorrer em cascata também, ou seja, deve ser propagado para todas as tabelas dependentes. É possível?

10 Respostas

danieldestro

Deixe-me advinhar. Seu sistema, em vez de deletar o registro, por questões de auditoria e histórico, terá de manter o registro, atualizando um campo "ativo"=false. É isso?

Bom, se AOP, implementa uma classe que estende o EntityManager, e usa essa implementação, sobrescrevendo o método delete dele.

Exemplo:

public class MagicEntityManager extends EntityManager {
  private EntityManager entityManager;

  public MagicEntityManager( EntityManager e ) {
    this.entityManager = e;
  }

  public void delete(Object o) {
    //faz qq coisa aqui
  }

  //outros métodos aqui
}
J2Alex

Olá Daniel,

O EntityManager é específico do Java 5, correto? Se for, eu preciso disso pra Java 1.4.

E mesmo que eu fizesse dessa forma, os deletes (updates) não seriam propagados para as outras entidades, seriam?

danieldestro

Eu to tão entretido nessa coisa de JPA que so penso nisso. heheehhehe
Faça o mesmo como Session do Hibernate, assim:

public void delete(Object o) { update(o); }

Se é o seu caso.

J2Alex

Daniel,

Essa foi a primeira idéia que tive, mas a questão é que o Session é uma interface e a classe que implementa essa interface no Hibernate (SessionImpl) é final.

Tem alguma outra idéia? É exatamente para o que você falou: historiamento.

passos

Se e historico por nao chamar uma outro metodo delete que na verdade invalida esse dado mas utiliza o update? Nao seria mais facil?

danieldestro

J2Alex , minha solução é possível.

TuClasse imlements Session e recebe um “Session” no construtor.

J2Alex

A principal questão aqui é que preciso que isso se propague para as outras as entidades. Por exemplo: Se eu seto uma propriedade para o status de deletada, isso deve se propagar para as entidades que recebem a chave da entidade “deletada” - ou seja: todas as outras entidades deverão ter seu status de deletado alterados.

Ok… como eu disse, eu já havia pensado nisso… mas a questão é essa que coloquei ao passos: dessa maneira eu não vou conseguir que estas alterações se propaguem… ou eu estou enganado? :roll:

danieldestro

Não existe mágica!

J2Alex

Não seria bem mágica. :lol:

Se a implementação do Session não fosse final, isso seria possível. Mas beleza, talvez não seja possível fazer isso tão facilmente… o que é uma pena - seria uma feature interessante para o hibernate.

Implementar minha Session para ter efeito em uma entidade apenas, é melhor fazer isso no próprio DAO… não há vantagem. A vantagem seria aproveitar as características de propagação do Hibernate.

lindberg713

Recussitando o tópico. Alguem encontrou a solução para isto? Alguem sabe como fazer isso? Resumindo, fazer um quando der um delete no hibernate, mudar para update inclusive fazendo uso do cascade para fazer update também não entidades que dependem desta.

Obrigado!

Criado 25 de janeiro de 2007
Ultima resposta 1 de out. de 2010
Respostas 10
Participantes 4