Auditoria de Entidades no Hibernate com Envers

Dayvit SiqueiraDayvit Siqueira
3 min read

A auditoria de dados é um requisito essencial em diversas aplicações corporativas, permitindo o rastreamento de alterações em registros do banco de dados. No ecossistema Java, o Hibernate Envers se destaca como uma solução poderosa e fácil de implementar para auditar entidades de maneira automática.

O que é o Hibernate Envers?

O Hibernate Envers é um módulo do Hibernate ORM que permite registrar automaticamente as alterações feitas nas entidades do banco de dados. Ele mantém um histórico de versões de cada entidade anotada para auditoria, armazenando todas as operações de inserção, atualização e exclusão.

Como o Envers Funciona?

O Envers funciona criando tabelas de auditoria que armazenam as versões das entidades auditadas. Essas tabelas seguem um padrão específico, geralmente adicionando o sufixo _AUD ao nome original da entidade. Por exemplo, se temos uma entidade chamada Usuario, o Envers criará automaticamente uma tabela chamada Usuario_AUD, que armazenará as versões antigas da entidade.

Configurando o Hibernate Envers

1. Adicionando a Dependência no Maven

Para utilizar o Envers, primeiro é necessário adicionar a dependência ao projeto Maven:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>6.4.0.Final</version> <!-- Ajuste conforme a versão do Hibernate utilizada -->
</dependency>

2. Anotando Entidades para Auditoria

O próximo passo é anotar as entidades que devem ser auditadas com @Audited:

import jakarta.persistence.*;
import org.hibernate.envers.Audited;

@Entity
@Audited
public class Usuario {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String nome;
    private String email;

    // Getters e Setters
}

A partir desse momento, qualquer alteração realizada nessa entidade será registrada automaticamente na tabela de auditoria Usuario_AUD.

3. Consultando o Histórico de Alterações

Para recuperar o histórico das entidades auditadas, utilizamos a AuditReader:

import org.hibernate.envers.AuditReader;
import org.hibernate.envers.AuditReaderFactory;
import org.hibernate.envers.query.AuditEntity;
import org.hibernate.Session;
import java.util.List;

Session session = entityManager.unwrap(Session.class);
AuditReader auditReader = AuditReaderFactory.get(session);

List<Object[]> revisoes = auditReader.createQuery()
    .forRevisionsOfEntity(Usuario.class, false, true)
    .add(AuditEntity.id().eq(1L)) // Busca o histórico do usuário com ID = 1
    .getResultList();

for (Object[] revisao : revisoes) {
    Usuario usuario = (Usuario) revisao[0];
    System.out.println("Nome: " + usuario.getNome());
}

Com esse código, podemos recuperar todas as versões anteriores de uma entidade e analisar as modificações ao longo do tempo.

Registrando o Usuário Responsável pela Alteração

Por padrão, o Envers registra apenas os dados da entidade, mas podemos estender sua funcionalidade para armazenar também quem realizou cada alteração.

1. Criando uma Entidade de Revisão

import jakarta.persistence.*;
import org.hibernate.envers.RevisionEntity;
import org.hibernate.envers.RevisionNumber;
import org.hibernate.envers.RevisionTimestamp;
import java.util.Date;

@Entity
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevisionEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @RevisionNumber
    private int id;

    @RevisionTimestamp
    private Date timestamp;

    private String usuario;

    // Getters e Setters
}

2. Criando um RevisionListener

import org.hibernate.envers.RevisionListener;

public class CustomRevisionListener implements RevisionListener {

    @Override
    public void newRevision(Object revisionEntity) {
        CustomRevisionEntity rev = (CustomRevisionEntity) revisionEntity;
        rev.setUsuario(AuditoriaUtils.getUsuarioLogado()); // Obtém o usuário logado
    }
}

Agora, além de armazenar os dados modificados, também registramos quem fez a alteração e quando ela ocorreu.

3. Exemplo de Dados na Tabela de Auditoria

Após configurar o RevisionListener, os registros de auditoria podem ser consultados da seguinte forma:

RevisãoIDNomeE-mailTipo de operaçãoUsuário
11Joãojoao@email.comINSERTadmin
21Joãojoaonovo@email.comUPDATEgestor

Dessa forma, temos um controle detalhado sobre todas as modificações realizadas na base de dados.

Conclusão

O Hibernate Envers é uma solução eficiente para auditoria de entidades no Hibernate. Ele permite rastrear mudanças automaticamente sem a necessidade de implementar manualmente logs ou triggers no banco de dados. Com algumas configurações adicionais, é possível capturar não apenas as alterações nos dados, mas também informações sobre quem realizou cada modificação.

Se você precisa de um sistema confiável de auditoria para seu banco de dados, o Envers é uma escolha altamente recomendada! 🚀

0
Subscribe to my newsletter

Read articles from Dayvit Siqueira directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Dayvit Siqueira
Dayvit Siqueira