danilomcb 11 de abr. de 2013
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?
danilomcb 15 de abr. de 2013
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 = 1 L ;
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.
danilomcb 15 de abr. de 2013
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?
Lucas_Cavalcanti 16 de abr. de 2013
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