Envers - Guardar usuário na tabela auditada

Boa tarde galera

Estou usando o envers para fazer a auditoria do sistema da empresa.
Hoje tenho a seguinte estrutura

@Audited
@Entity
@Table(name = "CLIENTE")
public class Cliente implements Serializable {

//propriedades

}

Um RevisionListener para add o usuário

[code]public class AuditoriaListener implements RevisionListener{

@Override
public void newRevision(Object revisionEntity){
    RevisionEntityWeb entity = (RevisionEntityWeb) revisionEntity;
	Usuario usuario = (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    entity.setUsuario(usuario.getCodigo().toString());
}

}[/code]

E uma entidade de revisao

[code]@Entity
@Table(name = “REVISION_ENTITY”)
@RevisionEntity(AuditoriaListener.class)
public class RevisionEntityWeb extends DefaultRevisionEntity {

private static final long serialVersionUID = 1L;

private String usuario;

public String getUsuario() {
    return usuario;
}

public void setUsuario(String usuario) {
    this.usuario = usuario;
}

}[/code]

Eu Gostaria que no lugar de gravar o usuário numa segunda tabela (REVISION_ENTITY)…
guardasse as informações na mesma tabela auditada no caso CLIENTE_AUD e não na REVISION_ENTITY
Pois a REVISION_ENTITY vai crescer muito pois muitas tabelas de grande porte são auditadas

Outra coisa tambem é mudar para ficar num banco a parte… e não no mesmo bando da app

Também gostaria de saber se pode botar o usuário que fez a alteração na tabela auditada, no seu caso CLIENTE_AUD.

Alguém pode ajudar?

Automaticamente não conheço um modo de fazer isso. Talvez se ele tiver acesso direto a JAAS, mas isso é só um chute.

O que faria seria algo como (na Entity):

[code]public class Customer {
private String updatedBy;

@PreUpdate
private preUpdate() {
	updatedBy = MDC.get("CURRENT_USER");
}	

}[/code]

E no controller: MDC.put("CURRENT_USER", session.get("USER"));

O MDC é uma classe que segura informações de modo “global” na thread, assim você consegue acessar informações que forem colocadas em outras camadas.

Fala galera! Demorou mas saiu. Eu resolvi este problema quando implementei minha camada de segurança com Shiro. Apos fazer todas as configurações do Shiro e ajustar o Hibernate Envers, adicionei o descrito abaixo para armazenar o usuário logado na aplicação nas tabelas de auditoria.

public class AuditoriaListener implements RevisionListener, Serializable {

	private static final long serialVersionUID = 1L;
	
	@Override
	public void newRevision(Object object) {
		Subject currentUser = SecurityUtils.getSubject();
		AuditoriaRevisao auditoriaRevisao = (AuditoriaRevisao) object;
		auditoriaRevisao.setLogin(currentUser.getPrincipal().toString());
	}

}

Espero ter ajudado. Abração.