Pular para o conteúdo principal

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​

AspectoJavaxJakarta
Pacotejavax.persistence.*jakarta.persistence.*
Spring Boot2.x (até 2.7.x)3.x+
JavaJava 8+Java 17+
StatusObsoletoAtual e recomendado
SuporteApenas manutençãoDesenvolvimento ativo
EmpresasAplicações antigasNovas aplicações

Versões do Spring Boot​

Versão Spring BootPacote JPAVersão Java
2.0 - 2.7.xjavax.persistenceJava 8+
3.0+jakarta.persistenceJava 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 javax por 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.xml para o Spring Boot 3.x
  • Atualize o Java para 17+
  • Substitua javax.persistence por jakarta.persistence
  • Substitua javax.validation por jakarta.validation
  • Substitua javax.transaction por jakarta.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.

➡️ Capítulo 3: Hibernate DDL

⬅️ Capítulo anterior: PostgreSQL

⬅️ Voltar ao Módulo 4