Hibernate, Envers, JPA e Flyway
Hibernate
A arquitetura do Hibernate é projetada para permitir que desenvolvedores interajam de forma eficiente e organizada com bancos de dados relacionais, escondendo a complexidade das operações SQL por trás de uma camada de abstração baseada em objetos Java.
O Hibernate abstrai o seu código SQL, toda a camada JDBC e o SQL será gerado em tempo de execução. Mais que isso, ele vai gerar o SQL que serve para um determinado banco de dados, já que cada banco fala um “dialeto” diferente dessa linguagem. Assim há também a possibilidade de trocar de banco de dados sem ter de alterar código Java, já que isso fica como responsabilidade da ferramenta.
Componentes
✅ SessionFactory
- Fábrica de sessões (
Session
). - Criado uma única vez (singleton) durante a inicialização da aplicação.
- Carrega e armazena configurações, mapeamentos e metadados.
- Alto custo de criação → deve ser reutilizado.
- Não interage diretamente com o banco.
✅ Session
- Interface principal de acesso ao banco de dados.
- Criada pela
SessionFactory
. - Realiza operações de persistência (save, update, delete, get).
- Não é thread-safe → usar uma por transação.
- Deve ser aberta, utilizada e fechada corretamente.
✅ Transaction
- Garante que um conjunto de operações ocorra de forma atômica.
- Inicia com
beginTransaction()
e termina comcommit()
ourollback()
. - Associada a uma
Session
. - Segue o modelo de transação ACID.
✅ Query
- Permite executar consultas no banco via:
- HQL (Hibernate Query Language) – baseada em objetos;
- SQL nativo;
- Criteria API (consultas programáticas).
- Usa
createQuery()
oucreateNativeQuery()
.
✅ Cache
- Melhora o desempenho ao reduzir acessos repetidos ao banco.
- Dois níveis:
- 1º nível (Session): ativado por padrão; vive enquanto a Session está aberta.
- 2º nível (SessionFactory): opcional, compartilha dados entre sessões.
- Pode usar implementações externas (EhCache, Infinispan, etc.).
Envers
Envers é uma extensão do Hibernate ORM que fornece uma maneira fácil de adicionar auditoria/controle de versão para entidades.
Funcionalidades
- Auditoria automática para todos os mapeamentos O/R definidos pela especificação JPA, além de alguns específicos do Hibernate.
- Registra os dados alterados a cada revisão usando uma entidade de revisão (
revision entity
). - Permite consultar versões históricas de uma entidade e suas associações.
Conceito de Revisão
- Assim como o controle de versão de código-fonte, o Envers trabalha com o conceito de revisão.
- Cada revisão representa o conjunto completo de alterações feitas nos campos auditáveis de uma entidade durante uma transação.
A interface AuditReader nos permite:
- Consultar uma entidade em uma determinada revisão e recuperar uma visão parcial do estado dessa entidade naquela revisão específica.
- Acessar listas de revisões associadas a um determinado tipo de entidade ou restritas por um determinado intervalo de datas.
- Obter metadados de revisão especificando quando uma alteração ocorreu.
JPA
JPA, ou Java Persistence API, é um framework baseado em POJOS (Plain Old Java Objects), destinada à persistir objetos em Java.
Ela define um conjunto de regras e interfaces que facilitam o mapeamento objeto-relacional (ORM - Object-Relational Mapping), permitindo que desenvolvedores armazenem e recuperem objetos Java diretamente de um banco de dados relacional. Com isso, a JPA elimina a necessidade de o desenvolvedor escrever SQL complexo para operações de CRUD (Create, Read, Update, Delete), automatizando o processo de comunicação entre a aplicação Java e o banco de dados.
-
Entidades: São classes que representam tabelas no banco de dados. Cada instância de uma entidade corresponde a uma linha da tabela. Uma entidade sempre tem uma chave primária (usada para identificar registros únicos), e é mapeada diretamente para uma tabela no banco. Ela é anotada com @Entity.
-
Classes embutidas (embeddable): São classes que não possuem chave primária nem representam uma tabela própria no banco de dados. Em vez disso, são incorporadas dentro de uma entidade. Elas são usadas para agrupar atributos relacionados que fazem parte de uma única entidade, sendo anotadas com @Embeddable.
Flyway
A biblioteca Flyway é uma ferramenta poderosa de versionamento de banco de dados em Java.
Em termos simples, o Flyway atua como uma "linha do tempo" das alterações no banco de dados, garantindo que cada modificação feita possa ser aplicada de forma sequencial e controlada em diferentes ambientes, seja em desenvolvimento, homologação ou produção.
Atua para gerenciar e facilitar as migrations de bancos de dados.
O processo de migração no Flyway segue uma lógica bem estruturada:
- Detectar as migrations ainda não aplicadas.
- Validar as migrations para assegurar que são compatíveis com o banco de dados atual.
- Aplicar as migrations pendentes na ordem correta, registrando o histórico de mudanças.