Capítulo 3: Hibernate e Estratégias DDL
Introdução
Pergunta: Como o Hibernate cria as tabelas no seu banco de dados?
Resposta: Através das estratégias DDL (Data Definition Language).
Neste capítulo, você vai entender:
- O que é Hibernate
- As 5 estratégias DDL (
none,validate,update,create,create-drop) - Quando usar cada estratégia
- Como configurar o Hibernate para PostgreSQL
O que é Hibernate?
Definição
Hibernate é a implementação da JPA (Java Persistence API) utilizada pelo Spring Boot.
Analogia:
- JPA = Interface (o "o quê") 📄
- Hibernate = Implementação (o "como") ⚙️
Exemplo:
// JPA define a interface
@Entity
public class Product { ... }
// Hibernate implementa o mapeamento
// Gera automaticamente o SQL
Papel do Hibernate
O Hibernate gerencia automaticamente:
-
Mapeamento Objeto-Relacional (ORM)
- Classe Java ↔ Tabela SQL
- Atributo Java ↔ Coluna SQL
-
Geração de SQL
findAll()→SELECT * FROM productssave()→INSERT INTO products ...
-
Gestão do Esquema
- Criação/modificação de tabelas (estratégias DDL)
As 5 Estratégias DDL
Visão Geral
| Estratégia | Comportamento | Uso recomendado |
|---|---|---|
| none | Nenhuma ação | Produção (com Flyway/Liquibase) |
| validate | Valida o esquema, não modifica nada | Produção |
| update | Atualiza o esquema (apenas adiciona) | Desenvolvimento |
| create | Recria o esquema a cada inicialização | Testes |
| create-drop | Cria na inicialização, remove ao parar | Testes |
1. ddl-auto: none
Comportamento: O Hibernate não altera o banco de dados.
Quando usar: Em produção com ferramentas de migração (Flyway, Liquibase).
Configuração:
spring:
jpa:
hibernate:
ddl-auto: none
Exemplo:
Inicializando a aplicação...
→ O Hibernate não cria/modifica nenhuma tabela
→ As tabelas já devem existir
Vantagens:
- ✅ Controle total do esquema
- ✅ Sem surpresas em produção
Desvantagens:
- ❌ Você precisa gerenciar as migrações manualmente
2. ddl-auto: validate
Comportamento: O Hibernate valida se o esquema corresponde às entidades, mas não o modifica.
Quando usar: Em produção para verificar a consistência.
Configuração:
spring:
jpa:
hibernate:
ddl-auto: validate
Exemplo:
Inicializando a aplicação...
→ O Hibernate compara as entidades com as tabelas
→ Se houver diferença → ERRO e parada
Erro típico:
Schema-validation: missing column [price] in table [products]
Vantagens:
- ✅ Detecta inconsistências
- ✅ Garante segurança na inicialização
Desvantagens:
- ❌ Não corrige automaticamente
3. ddl-auto: update
Comportamento: O Hibernate atualiza o esquema (adiciona colunas/tabelas, mas nunca remove).
Quando usar: Em desenvolvimento.
Configuração:
spring:
jpa:
hibernate:
ddl-auto: update
Exemplo:
Entidade inicial:
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
}
Banco de dados:
CREATE TABLE products (
id BIGINT PRIMARY KEY,
name VARCHAR(255)
);
Modificação da entidade:
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
private Double price; // NOVO
}
Inicialização da aplicação:
ALTER TABLE products ADD COLUMN price DOUBLE PRECISION;
✅ Coluna adicionada automaticamente!
Vantagens:
- ✅ Prático no desenvolvimento
- ✅ Não precisa gerenciar o esquema manualmente
Desvantagens:
- ❌ Não remove colunas obsoletas
- ❌ Pode causar inconsistências a longo prazo
- ❌ PERIGOSO em produção
4. ddl-auto: create
Comportamento: O Hibernate recria todas as tabelas a cada inicialização (remove e recria).
Quando usar: Para testes automatizados.
Configuração:
spring:
jpa:
hibernate:
ddl-auto: create
Exemplo:
Inicializando a aplicação...
→ DROP TABLE products;
→ CREATE TABLE products (...);
→ Todos os dados são PERDIDOS
Vantagens:
- ✅ Esquema sempre limpo
- ✅ Ideal para testes
Desvantagens:
- ❌ PERDA TOTAL DE DADOS a cada inicialização
- ❌ NUNCA USAR EM PRODUÇÃO
5. ddl-auto: create-drop
Comportamento: Igual ao create, mas também remove as tabelas ao parar a aplicação.
Quando usar: Para testes unitários/integração.
Configuração:
spring:
jpa:
hibernate:
ddl-auto: create-drop
Exemplo:
Inicializando a aplicação...
→ DROP TABLE products;
→ CREATE TABLE products (...);
... testes ...
Parando a aplicação...
→ DROP TABLE products;
Vantagens:
- ✅ Ambiente de teste limpo
- ✅ Nenhum dado residual
Desvantagens:
- ❌ PERDA TOTAL DE DADOS
- ❌ NUNCA USAR EM PRODUÇÃO
Configuração Completa para PostgreSQL
Configuração de Desenvolvimento
Arquivo: application-dev.yml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/dev_db
username: postgres
password: ${DB_PASSWORD}
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: update # Prático em dev
show-sql: true # Ver as queries
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
format_sql: true # Formatar o SQL
Configuração de Produção
Arquivo: application-prod.yml
spring:
datasource:
url: jdbc:postgresql://prod-server:5432/prod_db
username: prod_user
password: ${DB_PASSWORD}
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: validate # Apenas validação
show-sql: false # Sem logs SQL em produção
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
Configuração de Testes
Arquivo: application-test.yml
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
hibernate:
ddl-auto: create-drop # Limpa após cada teste
show-sql: true
Dialetos do Hibernate
O que é um Dialeto?
Um dialeto é a adaptação do Hibernate para um banco de dados específico.
Analogia: Como os dialetos regionais de uma língua (português do Brasil vs português de Portugal).
Dialetos Comuns
| Banco de Dados | Dialeto Hibernate |
|---|---|
| PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
| MySQL 8+ | org.hibernate.dialect.MySQL8Dialect |
| SQL Server | org.hibernate.dialect.SQLServerDialect |
| Oracle 12c+ | org.hibernate.dialect.Oracle12cDialect |
| H2 | org.hibernate.dialect.H2Dialect |
| MariaDB | org.hibernate.dialect.MariaDBDialect |
Por que Especificar um Dialeto?
Exemplo: Geração de ID auto-incrementado
PostgreSQL:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY, -- PostgreSQL
name VARCHAR(255)
);
MySQL:
CREATE TABLE products (
id BIGINT AUTO_INCREMENT PRIMARY KEY, -- MySQL
name VARCHAR(255)
);
Sem dialeto: O Hibernate não sabe qual sintaxe usar.
Com dialeto: O Hibernate gera o SQL correto para seu banco de dados.
Logs SQL e Depuração
Exibir as Queries SQL
Configuração:
spring:
jpa:
show-sql: true # Ativa os logs SQL
properties:
hibernate:
format_sql: true # Formata o SQL para melhor leitura
Console:
Hibernate:
insert
into
products
(name, price, id)
values
(?, ?, ?)
Exibir os Valores dos Parâmetros
Configuração:
logging:
level:
org.hibernate.SQL: DEBUG # Logs SQL
org.hibernate.type.descriptor.sql.BasicBinder: TRACE # Valores dos parâmetros
Console:
Hibernate:
insert
into
products
(name, price, id)
values
(?, ?, ?)
binding parameter [1] as [VARCHAR] - [Laptop]
binding parameter [2] as [DOUBLE] - [999.99]
binding parameter [3] as [BIGINT] - [1]
Estratégias Recomendadas
Resumo Visual
Desenvolvimento
↓
ddl-auto: update
show-sql: true
↓
Mudanças rápidas
Tabelas criadas automaticamente
---
Testes
↓
ddl-auto: create-drop
show-sql: true
↓
Ambiente limpo
Dados apagados após os testes
---
Produção
↓
ddl-auto: validate (ou none)
show-sql: false
↓
Nenhuma modificação automática
Migrações gerenciadas por Flyway/Liquibase
Erros Comuns
Erro 1: Table Doesn't Exist
Erro:
Table "products" doesn't exist
Causa: ddl-auto: none ou validate, mas as tabelas não existem.
Solução: Use ddl-auto: update ou crie as tabelas manualmente.
Erro 2: Schema Mismatch
Erro:
Schema-validation: missing column [price] in table [products]
Causa: ddl-auto: validate, mas a entidade e a tabela diferem.
Solução:
- Altere para
updatetemporariamente - Ou modifique a tabela manualmente
Erro 3: Data Lost After Restart
Erro: Todos os meus dados desaparecem ao reiniciar!
Causa: ddl-auto: create ou create-drop.
Solução: Altere para update ou validate.
Resumo
Pontos-Chave
✅ Hibernate = Implementação da JPA
✅ 5 estratégias DDL: none, validate, update, create, create-drop
✅ Desenvolvimento: update
✅ Produção: validate ou none + Flyway
✅ Testes: create-drop
✅ Dialeto: Adapta o Hibernate ao seu banco de dados
Checklist Estratégias DDL
| Ambiente | Estratégia | show-sql |
|---|---|---|
| Desenvolvimento | update | true |
| Testes | create-drop | true |
| Produção | validate ou none | false |
Próximo Passo
Agora que você domina o Hibernate, vamos para o Capítulo 4 para conhecer o Lombok e reduzir o código boilerplate!