Bom dia galera. Estou com tentando fazer auditoria em um projeto que estou desenvolvendo e descobri o hibernate envers.
Estou com problema para fazer ele funcionar com vraptor e spring.
Alguém tem um tutorial ou um exemplo de como fazer isso?
Agradeço.
Ninguém?
Depois de pesquisar muito, juntei toda a bagagem e configurei o applicationContext.xml do Spring. Ficou assim:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
<property name="dataSource" ref="defaultDataSource" />
</bean>
<bean id="auditListener" class="org.hibernate.envers.event.AuditEventListener" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="defaultDataSource" />
<property name="packagesToScan" value="br.com.rastrus.**.domain" />
<property name="configLocation">
<value>classpath:/hibernate.cfg.xml</value>
</property>
<property name="eventListeners">
<map>
<entry key="post-insert" value-ref="org.hibernate.envers.event.AuditEventListener" />
<entry key="post-update" value-ref="org.hibernate.envers.event.AuditEventListener" />
<entry key="post-delete" value-ref="org.hibernate.envers.event.AuditEventListener" />
<entry key="pre-collection-update" value-ref="org.hibernate.envers.event.AuditEventListener" />
<entry key="pre-collection-remove" value-ref="org.hibernate.envers.event.AuditEventListener" />
<entry key="post-collection-recreate" value-ref="org.hibernate.envers.event.AuditEventListener" />
</map>
</property>
</bean>
</beans>
O problema agora é que eu utilizo o Hibernate 4, que não possui mais o eventListenrs (Hibernate 3.x) e esta dando erro ao rodar o sistema. Alguém sabe como configurar esses eventListeners no Spring para o Hibernate 4?
Consegui “configurar” o Envers. Na verdade mudei pra o Envers 4, anotei minhas classes com @Audited e funcionou. 
O meu problema agora é em customizar a minha informação na revisão, implementando RevisionListener. Não consigo adicionar o usuário da sessão nela. Pode ser algum problema do Envers com o Vraptor, ou com o spring, não sei. Eu inicio a minha aplicação, não aparece nenhum erro, mas também não funciona. Acredito que as classes não estejam sendo chamadas.
Esse é o código:
import javax.persistence.Entity;
import org.hibernate.envers.DefaultRevisionEntity;
import org.hibernate.envers.RevisionEntity;
import br.com.rastrus.arq.domain.User;
@Entity
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevisionEntity extends DefaultRevisionEntity {
private static final long serialVersionUID = 1L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
package br.com.rastrus.audit;
import org.hibernate.envers.RevisionListener;
import org.springframework.beans.factory.annotation.Autowired;
import br.com.rastrus.arq.web.SessionData;
public class CustomRevisionListener implements RevisionListener {
@Autowired
private SessionData sessionData;
@Override
public void newRevision(Object revisionEntity) {
((CustomRevisionEntity) revisionEntity).setUser(sessionData.getUser());
}
}
Se alguém poder ajudar, agradeço. 
Problema resolvido. Não estava mapeando a classe de domínio no hibernate.cfg. O problema agora é pegar o usuário da sessão e adicionar na entidade.
Alguém pode ajudar dessa vez?
Tenta usar isso:
UsuarioWeb user = VRaptorRequestHolder.currentRequest().getSession().getAttribute("usuarioWeb");
Supondo que seu componente da sessao eh esse.
Isso soh funciona se a entidade for alterada durante uma request