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
| Aspecto | Javax | Jakarta |
|---|---|---|
| Paquete | javax.persistence.* | jakarta.persistence.* |
| Spring Boot | 2.x (hasta 2.7.x) | 3.x+ |
| Java | Java 8+ | Java 17+ |
| Estado | Obsoleto | Actual y recomendado |
| Soporte | Solo mantenimiento | Desarrollo activo |
| Empresas | Aplicaciones antiguas | Nuevas aplicaciones |
Versiones de Spring Boot
| Versión Spring Boot | Paquete JPA | Versión Java |
|---|---|---|
| 2.0 - 2.7.x | javax.persistence | Java 8+ |
| 3.0+ | jakarta.persistence | Java 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
javaxpor 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.xmla Spring Boot 3.x - Actualice Java a 17+
- Reemplace
javax.persistenceporjakarta.persistence - Reemplace
javax.validationporjakarta.validation - Reemplace
javax.transactionporjakarta.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.