Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Desmistificando o
Hibernate Envers
em 10 passos
Auditoria de dados? Registro de Log? Trilha de auditoria? Descubra
como fcil, atravs do Hibernate Envers, rastrear o histrico de
mudanas e ter informaes de quem, quando e o que foi modificado
por um usurio. Em dez passos tem-se uma aplicao capaz de gerenciar todas as modificaes realizadas na base de dados de forma
simples e no intrusiva.
projeto na gesto de riscos do projeto. Cabe ao arquiteto decidir qual ser a soluo tcnica e o procedimento adotado para gerar uma trilha de auditoria
utilizando bibliotecas que auxiliam no registro histrico dos dados.
O framework Hibernate Envers nos ajuda a criar
trilhas de auditoria de forma simples, eficaz e principalmente no intrusiva, sendo compatvel com
projetos que utilizam o Hibernate para a camada de
persistncia. Esse framework ao facilitar o versionamento de classes persistentes (ORM) agrega valor ao
produto entregue ao cliente, visto possibilitar respostas sobre quem, quando e o que foi modificado.
5\
Hibernate Envers
O Envers (Easy Entity Versioning) um framework que possibilita o versionamento das entidades persistentes de forma simples e fcil, sendo
necessria somente a utilizao de anotaes. Com
isso permitido manter um histrico das alteraes
dos dados das entidades, sem que o desenvolvedor
gere classes especficas para o mapeamento das entidades de histrico. Para auditar as alteraes realizadas na entidade por meio de conceitos de reviso
similares aos do Subversion.
O conceito de reviso se caracteriza pela persistncia de uma entidade, mapeada pela biblioteca, em
uma transao atmica. Ou seja, para toda persistncia de uma entidade auditvel criada uma reviso,
um clone do objeto contendo um atributo de reviso
como chave primria que persiste em uma tabela de
histrico na base de dados.
O Hibernate Envers, mdulo do Hibernate, requer o Hibernate Annotations e o EntityManager
para o seu funcionamento. Alm disso, as entidades devem ter identificadores nicos (Primary Key)
imutveis. O Envers trabalha de forma autnoma ou
dentro de um container como JBoss AS, em conjunto com os Frameworks JBoss SEAM ou SpringFramework.
Algumas caractersticas:
Mapeamento da auditoria definido pela especificao do JPA.
Mapeamentos de auditoria, em conjunto com
a JPA, extensveis para atributos de dados,
como colees e mapas.
Criao de um registro de reviso para cada
registro de dados de auditoria, ou seja, para
cada entidade auditada criada uma entidade
/6
de reviso.
Consulta de dados histricos.
Para facilitar o entendimento dos passos abaixo utilizaremos um modelo de dados para ilustrar o
nosso universo (figura 1).
7\
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>3.6.10-Final</version>
</dependency>
Para auditar as entidades necessrio identific-las com a anotao @Audited da mesma maneira
como identificamos as entidades persistentes com @
Entity.
O Hibernate Core o Envers possibilita a customizao da nomenclatura da tabela tanto pela anotao
@AuditTable quanto pela @Table. Quando no se
Listagem 5. Adicionando a dependncia do Hiberna- utiliza essa anotao o Envers entende que a nomente Envers para Hibernate 4.1.
clatura da tabela de histrico ser o nome da classe
acrescentado pelo sufixo _AUD.
<dependency>
Para exemplificar a anotao @AuditTable temos
<groupId>org.hibernate</groupId>
uma entidade mapeada com a anotao @Table(name
<artifactId>hibernate-envers</artifactId>
= tabela, schema=dbschema) e o Envers entender
<version>4.1.0-Final</version>
que a nomenclatura da tabela de auditoria ser a ta</dependency>
bela_AUD para o esquema de banco de dados dbschema. No caso de se adicionar a entidade anotao
@AuditTable(name=hist_tabela, schema=dbhist)
Passo 4: Adicionando os listerners do
o Envers entender que a tabela de auditoria ser a
Envers
hist_tabela para o esquema dbhist. Assim podemos
O Hibernate Envers utiliza classes de listener que
customizar a nomenclatura das tabelas de registros
so responsveis pelas aes de auditoria, ou seja,
de dados histricos.
tm a funo de incluir registros nas tabelas de histrico de acordo com a ao realizada pelo usurio na Listagem 7. A Listagem 7 apresenta um exemplo de
aplicao.
mapeamento utilizando JPA e Hibernate Envers.
Essas classes de listener devem constar no arquivo persistence.xml, caso contrrio de nada adiantar
as annotations presentes nas Entidades responsveis @Entity
pela auditoria. Segue abaixo como deve ficar a confi- @Table(name = USUARIO, schema = DBSISTEMA)
@Audited
gurao no arquivo persistence.xml:
xml.
<properties>
<property name=hibernate.ejb.event.post-insert
value=org.hibernate.ejb.event.
EJB3PostInsertEventListener,
org.hibernate.envers.event.AuditEventListener />
<property name=hibernate.ejb.event.post-update
value= org.hibernate.ejb.event.
EJB3PostUpdateEventListener,
org.hibernate.envers.event.AuditEventListener />
<property name=hibernate.ejb.event.post-delete
value=org.hibernate.ejb.event.
EJB3PostDeleteEventListener,
org.hibernate.envers.event.AuditEventListener />
<property name=hibernate.ejb.event.precollection-update value= org.hibernate.envers.
event.AuditEventListener />
<property name=hibernate.ejb.event.precollection-remove value= org.hibernate.envers.
event.AuditEventListener />
<property name=hibernate.ejb.event.postcollection-recreate value= org.hibernate.
envers.event.AuditEventListener />
</properties>
/8
A partir do momento que existe a anotao @Audited, automaticamente todos os atributos e relacionamentos sero auditados sem necessitar de alguma
configurao para que isso acontea.
Caso seja necessrio, possvel limitar o que Listagem 9. A Listagem 9 apresenta uma entidade de
deve ser auditado. Por exemplo, pode-se definir que reviso mapeada com JPA e Hibernate Envers.
apenas algumas informaes de uma determinada tabela sejam necessrias para a auditoria ou para evitar
@Entity
que alguma coluna contendo um valor extenso seja @RevisionEntity(RevisaoListener.class)
armazenado tambm na tabela de auditoria, como @Table(name = REVISAO, schema = DBSISTEMA)
um Blob.
@SequenceGenerator(name = SEQ_REVISAO,
Para no auditar atributos ou relaciona- sequenceName = DBSISTEMA.SEQ_REVISAO,
mentos utilize as anotaes @NotAudited ou @ allocationSize = 1, initialValue = 1)
Audited(targetAuditMode = RelationTargetAuditMo- public class Revisao {
de.NOT_AUDiTED). A primeira anotao ignora to@Id
talmente o atributo ou relacionamento, sendo ideal
@GeneratedValue(generator = SEQ_REVISAO,
para relacionamentos que so somente leitura (constrategy = GenerationType.SEQUENCE)
figurados como insertable = false e updatable = false).
@Column(name = CODIGO_REVISAO, length = 8,
A segunda servir para relacionamentos com tabelas
nullable = false)
de domnio (code tables) com relacionamentos @
@RevisionNumber
ManyToOne, por exemplo. Os valores dessas tabelas
private Long codigoRevisao;
no sofrero alteraes por isso no seria interessan@RevisionTimestamp
te manter uma ou mais tabelas de histrico para ela.
@Temporal(TemporalType.TIMESTAMP)
@Column(name = DT_REVISAO)
private Date timestamp;
@Column(name = CODIGO_USUARIO)
private Long codigoUsuario;
@Column(name = EMAIL_USUARIO)
private String emailUsuario;
@Column(name = NOME_USUARIO)
private String nomeUsuario;
//...
}
9\
muitos para um (ManyToOne), este no ser carregado de forma automtica (mesmo utilizando o tipo
de inicializao EAGER). Este relacionamento precisa
ser inicializado manualmente utilizando-se o mtodo initialize da classe org.hibernate.Hibernate.
infelizmente, mesmo que seja feita uma inicializao explcita, o Envers no carregar os relacionamentos um para muitos (OneToMany) e muitos para
muitos (ManyToMany). Uma soluo seria carregar
separadamente a lista de Entidades que representam
um determinado relacionamento atravs de consultas com a APi do Envers utilizando o cdigo de reviso desejado e a classe especfica.
Passo 9: Relacionamentos
/ 10
Consideraes Finais
/referncias
> http://www.jboss.org/envers
> http://docs.jboss.org/envers/docs/index.html
> http://www.hibernate.org/
> http://download.jboss.org/envers/envers-1.2.2.gahibernate-3.3.pdf
11 \