Pular para o conteúdo principal

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:

  1. Mapeamento Objeto-Relacional (ORM)

    • Classe Java ↔ Tabela SQL
    • Atributo Java ↔ Coluna SQL
  2. Geração de SQL

    • findAll() → SELECT * FROM products
    • save() → INSERT INTO products ...
  3. Gestão do Esquema

    • Criação/modificação de tabelas (estratégias DDL)

As 5 Estratégias DDL​

Visão Geral​

EstratégiaComportamentoUso recomendado
noneNenhuma açãoProdução (com Flyway/Liquibase)
validateValida o esquema, não modifica nadaProdução
updateAtualiza o esquema (apenas adiciona)Desenvolvimento
createRecria o esquema a cada inicializaçãoTestes
create-dropCria na inicialização, remove ao pararTestes

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 DadosDialeto Hibernate
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
MySQL 8+org.hibernate.dialect.MySQL8Dialect
SQL Serverorg.hibernate.dialect.SQLServerDialect
Oracle 12c+org.hibernate.dialect.Oracle12cDialect
H2org.hibernate.dialect.H2Dialect
MariaDBorg.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 update temporariamente
  • 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​

AmbienteEstratégiashow-sql
Desenvolvimentoupdatetrue
Testescreate-droptrue
Produçãovalidate ou nonefalse

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!

➡️ Capítulo 4: Lombok

⬅️ Capítulo anterior: Jakarta vs Javax

⬅️ Voltar ao Módulo 4