Ajuda com auditoria de UPDATE no JPA [RESOLVIDO]

Pessoal…

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.

Alguém conhece alguma solução???

Obrigado

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

Tem uma feature do JPA que permite vc criar uma espécie de interceptor. Não tenho certeza, mas procura por @EntityListeners

OK…

na resposta do Maracujá;

já existe lá nesse link Lifecycle Callbacks esse @EntityListeners.

o que tá complicado é:
Comparar campo a campo de objeto atachado com campo a campo de um não atachado!!!

blz???

novamente aguardo novas respostas

SEGUINTE GALERA!!!

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;

String[] className = model.getClass().getName().split("\$\$");
oldObj = pm.getEntityManager().find(Class.forName(className[0]), ReflectionObj.invokeMethod(“getId”, model));[/code]

Abraço galera!!!
E obrigado pela ajuda de todos!!

os relacionamentos many-to-many também são auditados?? se for como vc fez??

Bom…
aí esse método getId() retorna a chave composta… com o id das 2 tabelas

Eu to fazendo auditoria aqui utilizando o Interceptor do Hibernate…
então não é tão simples assim como vc tá dizendo ae.

vlw

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

OK?

é 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…

Quero algo mais prático para o usuário.

Olá, você pode implementar isso com Lifecycle Callbacks. E se vc desejar, poderia usar reflexão para fazer algo genérico.

[]'s