Capítulo 2: Jakarta vs Javax Persistence
Introdução
Se você já viu código Spring Boot na internet, provavelmente encontrou dois tipos diferentes de imports:
import javax.persistence.*; // Antigo
import jakarta.persistence.*; // Novo
Pergunta: Qual é a diferença? Qual usar?
Resposta curta: Use Jakarta (jakarta.persistence) para todos os seus novos projetos com Spring Boot 3.x+.
Histórico: Java EE → Jakarta EE
A Transição
Antes de 2019: Java EE (pacotes javax.*)
A Oracle era proprietária do Java EE (Java Enterprise Edition), que incluía o JPA (Java Persistence API).
Após 2019: Jakarta EE (pacotes jakarta.*)
A Oracle transferiu o Java EE para a Eclipse Foundation, que o renomeou para Jakarta EE.
Problema legal: A Oracle detinha os direitos sobre o nome javax, então a Eclipse precisou criar um novo namespace: jakarta.
Analogia
Imagine que uma empresa (Oracle) vende sua divisão (Java EE) para outra empresa (Eclipse Foundation).
Oracle diz: "Você pode ficar com o produto, mas não com o logo e o nome."
Eclipse responde: "OK, vamos renomear para Jakarta EE e trocar todos os pacotes."
Resultado:
- Mesma funcionalidade
- Novo nome de pacote
- Novo começo
Comparação Javax vs Jakarta
Tabela Comparativa
| Aspecto | Javax | Jakarta |
|---|---|---|
| Pacote | javax.persistence.* | jakarta.persistence.* |
| Spring Boot | 2.x (até 2.7.x) | 3.x+ |
| Java | Java 8+ | Java 17+ |
| Status | Obsoleto | Atual e recomendado |
| Suporte | Apenas manutenção | Desenvolvimento ativo |
| Empresas | Aplicações antigas | Novas aplicações |
Versões do Spring Boot
| Versão Spring Boot | Pacote JPA | Versão Java |
|---|---|---|
| 2.0 - 2.7.x | javax.persistence | Java 8+ |
| 3.0+ | jakarta.persistence | Java 17+ |
Regra simples:
- Spring Boot 2.x →
javax - Spring Boot 3.x →
jakarta
Migração: Javax → Jakarta
Exemplo Completo
Antes (Javax - Spring Boot 2.x)
Arquivo: model/Product.java
package com.example.demo.model;
import javax.persistence.*;
import javax.validation.constraints.*;
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Size(min = 3, max = 100)
private String name;
@Min(0)
private Double price;
// Construtores, getters, setters
}
Depois (Jakarta - Spring Boot 3.x)
Arquivo: model/Product.java
package com.example.demo.model;
import jakarta.persistence.*;
import jakarta.validation.constraints.*;
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Size(min = 3, max = 100)
private String name;
@Min(0)
private Double price;
// Construtores, getters, setters
}
Mudança: Substitua todos os javax por jakarta.
Anotações Afetadas
Veja as anotações que você precisará migrar:
JPA (Persistence)
// Javax
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.Column;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.JoinColumn;
// Jakarta
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Column;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.JoinColumn;
Validação
// Javax
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
import javax.validation.constraints.Email;
// Jakarta
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Email;
Transações
// Javax
import javax.transaction.Transactional;
// Jakarta
import jakarta.transaction.Transactional;
Nota: O Spring também fornece @Transactional, que permanece igual:
import org.springframework.transaction.annotation.Transactional;
Migração Automática no VS Code
Método 1: Buscar e Substituir
Passo 1: Abra a busca global (Ctrl+Shift+F ou Cmd+Shift+F)
Passo 2: Ative o modo Regex (ícone .*)
Passo 3: Busque por:
javax\.persistence
Passo 4: Substitua por:
jakarta.persistence
Passo 5: Faça o mesmo para:
javax\.validation
Substitua por:
jakarta.validation
Método 2: Script PowerShell (Windows)
# Navegue até seu projeto
cd C:\path\to\your\project
# Substituir javax.persistence por jakarta.persistence
Get-ChildItem -Recurse -Filter *.java | ForEach-Object {
(Get-Content $_.FullName) -replace 'javax\.persistence', 'jakarta.persistence' | Set-Content $_.FullName
}
# Substituir javax.validation por jakarta.validation
Get-ChildItem -Recurse -Filter *.java | ForEach-Object {
(Get-Content $_.FullName) -replace 'javax\.validation', 'jakarta.validation' | Set-Content $_.FullName
}
Método 3: Script Bash (Linux/macOS)
# Navegue até seu projeto
cd /path/to/your/project
# Substituir javax.persistence por jakarta.persistence
find . -name "*.java" -type f -exec sed -i '' 's/javax\.persistence/jakarta.persistence/g' {} +
# Substituir javax.validation por jakarta.validation
find . -name "*.java" -type f -exec sed -i '' 's/javax\.validation/jakarta.validation/g' {} +
Compatibilidade com Spring Boot
Spring Boot 2.x (Javax)
pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
Java: 8, 11 ou 17
Imports: javax.persistence.*
Spring Boot 3.x (Jakarta)
pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
Java: 17+ (obrigatório)
Imports: jakarta.persistence.*
Resolução de Problemas Comuns
Erro 1: ClassNotFoundException
Erro:
java.lang.ClassNotFoundException: javax.persistence.Entity
Causa: Você está usando Spring Boot 3.x com imports javax.
Solução: Substitua todos os javax por jakarta.
Erro 2: NoClassDefFoundError
Erro:
java.lang.NoClassDefFoundError: jakarta/persistence/Entity
Causa: Você está usando Spring Boot 2.x com imports jakarta.
Soluções:
Opção 1: Atualize para o Spring Boot 3.x
Opção 2: Volte para os imports javax
Erro 3: Versão Java Incorreta
Erro:
invalid target release: 17
Causa: O Spring Boot 3.x exige Java 17+, mas você está usando Java 11 ou inferior.
Solução: Instale o Java 17+ e atualize o pom.xml:
<properties>
<java.version>17</java.version>
</properties>
Qual Versão Escolher?
Para Novos Projetos
Use Jakarta (Spring Boot 3.x+)
Vantagens:
- ✅ Últimos recursos do Spring
- ✅ Suporte ativo
- ✅ Melhor desempenho
- ✅ Segurança atualizada
- ✅ Preparado para o futuro
Configuração:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
import jakarta.persistence.*;
Para Projetos Existentes
Se Spring Boot 2.x:
- Permaneça com
javaxpor enquanto - Planeje uma migração para o Spring Boot 3.x
Se Spring Boot 3.x:
- Migre imediatamente para
jakarta
Checklist de Migração
Antes de Migrar
- Verifique a versão do Spring Boot
- Verifique a versão do Java (17+ obrigatório)
- Faça backup do seu código (Git commit)
- Liste todas as dependências de terceiros
Migração
- Atualize o
pom.xmlpara o Spring Boot 3.x - Atualize o Java para 17+
- Substitua
javax.persistenceporjakarta.persistence - Substitua
javax.validationporjakarta.validation - Substitua
javax.transactionporjakarta.transaction - Atualize as dependências de terceiros (se necessário)
Após a Migração
- Compile o projeto (
mvn clean compile) - Execute os testes (
mvn test) - Inicie a aplicação (
mvn spring-boot:run) - Teste todas as funcionalidades
- Verifique os logs para warnings
Resumo
Pontos-Chave
✅ Jakarta = Novo padrão (Spring Boot 3.x+, Java 17+)
✅ Javax = Padrão antigo (Spring Boot 2.x, Java 8+)
✅ Migração = Simples (Buscar/Substituir)
✅ Sempre use Jakarta para novos projetos
Analogia Final
Javax = Windows XP 💾
- Ainda funciona
- Mas sem suporte
Jakarta = Windows 11 🖥️
- Moderno
- Suporte ativo
- Recomendado para o futuro
Próximo Passo
Agora que você entende Jakarta vs Javax, vamos para o Capítulo 3 para dominar Hibernate e Estratégias DDL.