Saltar al contenido principal

Capítulo 2: Jakarta vs Javax Persistence

Introducción​

Si ya ha visto código de Spring Boot en línea, probablemente haya visto dos tipos diferentes de imports:

import javax.persistence.*;  // Antiguo
import jakarta.persistence.*; // Nuevo

Pregunta: ¿Cuál es la diferencia? ¿Cuál debe usar?

Respuesta corta: Use Jakarta (jakarta.persistence) para todos sus nuevos proyectos con Spring Boot 3.x+.


Historia: Java EE → Jakarta EE​

La Transición​

Antes de 2019: Java EE (paquetes javax.*)

Oracle era propietario de Java EE (Java Enterprise Edition), que incluía JPA (Java Persistence API).

Después de 2019: Jakarta EE (paquetes jakarta.*)

Oracle transfirió Java EE a la Eclipse Foundation, que lo renombró como Jakarta EE.

Problema legal: Oracle tenía los derechos sobre el nombre javax, así que Eclipse tuvo que crear un nuevo namespace: jakarta.


Analogía​

Imagine que una empresa (Oracle) vende su división (Java EE) a otra empresa (Eclipse Foundation).

Oracle dice: "Puede quedarse con el producto, pero no con el logo ni el nombre."

Eclipse responde: "OK, lo renombraremos Jakarta EE y cambiaremos todos los paquetes."

Resultado:

  • Misma funcionalidad
  • Nuevo nombre de paquete
  • Nuevo comienzo

Comparación Javax vs Jakarta​

Tabla Comparativa​

AspectoJavaxJakarta
Paquetejavax.persistence.*jakarta.persistence.*
Spring Boot2.x (hasta 2.7.x)3.x+
JavaJava 8+Java 17+
EstadoObsoletoActual y recomendado
SoporteSolo mantenimientoDesarrollo activo
EmpresasAplicaciones antiguasNuevas aplicaciones

Versiones de Spring Boot​

Versión Spring BootPaquete JPAVersión Java
2.0 - 2.7.xjavax.persistenceJava 8+
3.0+jakarta.persistenceJava 17+

Regla simple:

  • Spring Boot 2.x → javax
  • Spring Boot 3.x → jakarta

Migración: Javax → Jakarta​

Ejemplo Completo​

Antes (Javax - Spring Boot 2.x)​

Archivo: 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;

// Constructeurs, getters, setters
}

Después (Jakarta - Spring Boot 3.x)​

Archivo: 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;

// Constructeurs, getters, setters
}

Cambio: Reemplace todos los javax por jakarta.


Anotaciones Afectadas​

Estas son las anotaciones que deberá 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;

Validación​

// 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;

Transacciones​

// Javax
import javax.transaction.Transactional;

// Jakarta
import jakarta.transaction.Transactional;

Nota: Spring también provee @Transactional que permanece igual:

import org.springframework.transaction.annotation.Transactional;

Migración Automática en VS Code​

Método 1: Buscar y Reemplazar​

Paso 1: Abra la búsqueda global (Ctrl+Shift+F o Cmd+Shift+F)

Paso 2: Active el modo Regex (icono .*)

Paso 3: Busque:

javax\.persistence

Paso 4: Reemplace por:

jakarta.persistence

Paso 5: Haga lo mismo para:

javax\.validation

Reemplace por:

jakarta.validation

Método 2: Script PowerShell (Windows)​

# Navegar a su proyecto
cd C:\path\to\your\project

# Reemplazar javax.persistence por jakarta.persistence
Get-ChildItem -Recurse -Filter *.java | ForEach-Object {
(Get-Content $_.FullName) -replace 'javax\.persistence', 'jakarta.persistence' | Set-Content $_.FullName
}

# Reemplazar 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)​

# Navegar a su proyecto
cd /path/to/your/project

# Reemplazar javax.persistence por jakarta.persistence
find . -name "*.java" -type f -exec sed -i '' 's/javax\.persistence/jakarta.persistence/g' {} +

# Reemplazar javax.validation por jakarta.validation
find . -name "*.java" -type f -exec sed -i '' 's/javax\.validation/jakarta.validation/g' {} +

Compatibilidad con 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, o 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+ (obligatorio)
Imports: jakarta.persistence.*


Resolución de Problemas Comunes​

Error 1: ClassNotFoundException​

Error:

java.lang.ClassNotFoundException: javax.persistence.Entity

Causa: Está usando Spring Boot 3.x con imports javax.

Solución: Reemplace todos los javax por jakarta.


Error 2: NoClassDefFoundError​

Error:

java.lang.NoClassDefFoundError: jakarta/persistence/Entity

Causa: Está usando Spring Boot 2.x con imports jakarta.

Soluciones:

Opción 1: Actualice a Spring Boot 3.x

Opción 2: Vuelva a los imports javax


Error 3: Versión de Java Incorrecta​

Error:

invalid target release: 17

Causa: Spring Boot 3.x requiere Java 17+, pero está usando Java 11 o menor.

Solución: Instale Java 17+ y actualice pom.xml:

<properties>
<java.version>17</java.version>
</properties>

¿Qué Versión Elegir?​

Para Nuevos Proyectos​

Use Jakarta (Spring Boot 3.x+)

Ventajas:

  • ✅ Últimas funcionalidades de Spring
  • ✅ Soporte activo
  • ✅ Mejor rendimiento
  • ✅ Seguridad actualizada
  • ✅ Preparado para el futuro

Configuración:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
import jakarta.persistence.*;

Para Proyectos Existentes​

Si usa Spring Boot 2.x:

  • Permanezca en javax por ahora
  • Planifique una migración a Spring Boot 3.x

Si usa Spring Boot 3.x:

  • Migre inmediatamente a jakarta

Checklist de Migración​

Antes de Migrar​

  • Verifique la versión de Spring Boot
  • Verifique la versión de Java (17+ requerido)
  • Haga una copia de seguridad de su código (Git commit)
  • Liste todas las dependencias de terceros

Migración​

  • Actualice pom.xml a Spring Boot 3.x
  • Actualice Java a 17+
  • Reemplace javax.persistence por jakarta.persistence
  • Reemplace javax.validation por jakarta.validation
  • Reemplace javax.transaction por jakarta.transaction
  • Actualice las dependencias de terceros (si es necesario)

Después de la Migración​

  • Compile el proyecto (mvn clean compile)
  • Ejecute los tests (mvn test)
  • Inicie la aplicación (mvn spring-boot:run)
  • Pruebe todas las funcionalidades
  • Revise los logs en busca de advertencias

Resumen​

Puntos Clave​

✅ Jakarta = Nuevo estándar (Spring Boot 3.x+, Java 17+)
✅ Javax = Estándar antiguo (Spring Boot 2.x, Java 8+)
✅ Migración = Simple (Buscar/Reemplazar)
✅ Siempre use Jakarta para nuevos proyectos


Analogía Final​

Javax = Windows XP 💾

  • Sigue funcionando
  • Pero ya no tiene soporte

Jakarta = Windows 11 🖥️

  • Moderno
  • Soportado activamente
  • Recomendado para el futuro

Próximo Paso​

Ahora que entiende Jakarta vs Javax, pasemos al Capítulo 3 para dominar Hibernate y las Estrategias DDL.

➡️ Capítulo 3: Hibernate DDL

⬅️ Capítulo anterior: PostgreSQL

⬅️ Volver al Módulo 4