já postei esses dias atrás um tópico parecido com este aqui no fórum,
e na verdade, a resposta que consegui aqui não foi muito solucionadora.
Portanto, venho aqui novamente pedir encarecidamente a ajuda de vocês.
Estou utilizando Hibernate e preciso de um LOG de campos dos objetos persistidos,
ou seja, uma auditoria de quais campos foram alterados ao fazer o UPDATE em um objeto , e se
este objeto possui relacionamentos, quais campos dos objetos relacionados que foram alterados tb.
Já vasculhei essa Internet, fóruns internacionais, hibernate.org , blogs, porém em lugar nenhum
encontrei uma solução que me apresente: performance boa, facilidade na implementação, e
que funcione!!!
parece uma coisa simples de ser feita, e na verdade seria, se estivéssemos falando em JDBC puro,
ao invés de Hibernate. Se vocês tivessem alguma outra solução também, fora utilizar os recursos
de Interceptor do hibernate… eu agradeço.
Bom,
Reflection já tentei aqui , porém na hora de fazer uma nova instância da classe,
o Hibernate tras um objeto do tipo: [nome da classe]+$$EnhrancedBy, e é esse
EnhancedBy que me ferra a vida rsrsrs.
Quanto ao Lifecycle Callbacks, ok muito boa solução, mas para a implementação de
LOG simples, o qual grava apenas a data de atualização.
O que está complicado é a comparação de um objeto antigo que está no banco,
com o objeto novo que está vindo para atualizá-lo, porém, fazendo isso com o HIBERNATE.
Não sei se vc já chegou a estudar isso a fundo, mas o HIBERNATE possui o maldito PROXY,
que tem a função de atachar o objeto quando vc o recupera e faz o que eu coloquei aí em cima,
dando uma referência para o objeto e não exatamente uma instância do objeto.
Como fazer então, a comparação campo a campo de um objeto que vem do HIBERNATE com
um objeto que vem da view???
Bom, agora está melhor formulada minha dúvida, se alguém conhece alguma outra solução,
Ajude-me por favor!!! OBRIGADO
RESOLVI COM UM R.T.A. (Recurso Técnico Avançado) rsrs
Sei que muita gente aqui pode ser contra esse tipo de prática,
porém, foi uma estratégia que encontramos para solucionar nosso problema
aqui na empresa.
em todas as minhas Classes Entity, tenho um método getId(),
que retorna o id do objeto instanciado, se ele não for nulo, é claro.
Então, na classe que faz a auditoria dos objetos NEW e OLD, fiz o seguinte:
Primeiro, resgato no String[] className apenas o nome da classe sem estar com o
maldito $$EnhancedBy.
[code]
// ReflectionObj: classe que auxilia-me na utilização de reflexão;
// oldObj : objeto que que está sendo recuperado da base de dados;
// model : objeto que está vindo da view;
Sim sim…
esqueci de lhe falar isso…
ao atualizar um objeto que possui uma coleção de outros objetos
eu simplesmente ignoro essa coleção… assim, possuo na minha
rotina de update, uma forma de atualizar item a item dessa coleção também,
então da mesma forma ele fará a auditoria da pk de uma tabela de chave composta
é kra, mas aconteçe que todos esses dados da minha auditoria será disponibilizado em uma tela que para o usuário possa acompanhar tudo que é feito no sistema.
Como em relacionamentos MxN, geralmente, a coleção é enviada para persistência somente com os códigos, eu só conseguiria guardar os códigos de kda item da coleção.
E guardar somente os códigos seria totalmente improdutivo para visualização do usuário…