A maioria das aplicações de médio e grande porte necessita
de geração de Log´s e Auditoria, sempre foi um requisito não funcional para
auditar dados sigilosos e importantes. Com a necessidade surgiu a framework que ajuda na
construção desses dados auditados (Hibernate Envers), onde neste artigo irei
explicar como utiliza-lo.
Usaremos a versão do Hibernate Envers 1.2.2 (compatível com
o hibernate 3.3.X), não é uma versão final, e utilizar o JBOSS 5.0.1 GA como
servidor e JPA 2. Lembrando que devemos acrescentar o JAR do hibernate envers
no JBOSS para funcionar a aplicação.
Configurando o Hibernate Envers
Para cada entidade que deve ser auditada (gerada um log),
devemos utilizar a annotation @Audited, nesta anotação você deixa explicito que
a entidade X deve ser auditada a cada execução de insert, update e delete, mas
falta algo para na configuração que deixa explícitos quais operações a entidade
deve ser log, temos a configuração no persistence.xml, segue abaixo:
<property
name="hibernate.ejb.event.post-insert"
value="org.hibernate.envers.event.AuditEventListener" />
<property
name="hibernate.ejb.event.post-update"
value="org.hibernate.envers.event.AuditEventListener" />
<property
name="hibernate.ejb.event.post-delete"
value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-update"
value="org.hibernate.envers.event.AuditEventListener" />
<property
name="hibernate.ejb.event.pre-collection-remove"
value="org.hibernate.envers.event.AuditEventListener" />
<property
name="hibernate.ejb.event.post-collection-recreate"
value="org.hibernate.envers.event.AuditEventListener" />
Está configuração serve para dizer as operações que Envers
irá executar para cada entidade anotada.
Sim é uma situação muito simples de configurar e anotar as
entidades, mas deve lembrar que analisar e arquitetar as entidades e verificar
que aqueles dados sim são importantes e devem ser auditados, pois nem todos os
dados devem ser auditados e pode sim atrapalhar o consumo de dados no banco.
Que ganho tem na minha aplicação
Simples, quando geramos trigger para gerar essas auditorias
sempre temos que disparar um gatilho no banco, além de consumir um recurso do
banco temos esse GAP para disparo, na aplicação Java o momento de utilização
das seguintes operações update, delete e insert é o momento que o Envers irá
executar, então estaremos utilizando o mesmo consumo e recurso é como se estivéssemos
gravando juntamente com cada operação do banco.
Mas a aplicação pode ficar sobrecarregada
Não, pois a própria framework cuida disso, este problema já
havia sido levado em consideração e devemos utilizar entidade apenas para
auditoria para que não utilize o mesmo recurso da sessão do JPA e ou Hibernate.
Como sabemos ele abre Threads para cada transação, utilizando sempre a mesma
conexão, para que não gere concorrência e gere um gargalo da aplicação. Então
irá consumir ou sobrecarregar a aplicação? Não.
Como consultar
O Envers possui um processo de Criteria do Hibernate, com os
métodos AuditReader e o AuditQuery. O primeiro é para consultas e retorno de
dados e o segundo é para construção de query´s mais pesadas.
Vale lembrar que as consultas que possua entidades com
listas, todas elas você deverá percorrer, pois o Envers trata os @ManytoMany e
@ManytoOne como FetchType como Lazy, caso na consulta você não deixe explicito
que necessita que aquele objeto deve ser carregado, irá trazer uma lista não
concluída, no momento de acessa-lo irá estourar um erro do próprio Hibernate.
Exemplo de entidade anotada
@Entity
@Audited //Anotação
da entidade dizendo que esta devera ser auditada
public class Pessoa {
}
Conclusão
Podemos ter auditoria de dados e logs acoplado no Java, vimos que temos
um recurso Java que não consome tanto recurso do banco e que é certamente
seguro.
Qualquer dúvida só entrar em contato.
Referencias: