Chapitre 2: Jakarta vs Javax Persistence
Introduction
Si vous avez déjà regardé du code Spring Boot en ligne, vous avez probablement vu deux types d'imports différents:
import javax.persistence.*; // Ancien
import jakarta.persistence.*; // Nouveau
Question: Quelle est la différence? Lequel utiliser?
Réponse courte: Utilisez Jakarta (jakarta.persistence) pour tous vos nouveaux projets avec Spring Boot 3.x+.
Historique: Java EE → Jakarta EE
La Transition
Avant 2019: Java EE (packages javax.*)
Oracle possédait Java EE (Java Enterprise Edition), qui incluait JPA (Java Persistence API).
Après 2019: Jakarta EE (packages jakarta.*)
Oracle a transféré Java EE à la Fondation Eclipse, qui l'a renommé Jakarta EE.
Problème légal: Oracle détenait les droits sur le nom javax, donc Eclipse a dû créer un nouveau namespace: jakarta.
Analogie
Imaginez qu'une entreprise (Oracle) vend sa division (Java EE) à une autre entreprise (Eclipse Foundation).
Oracle dit: "Vous pouvez avoir le produit, mais pas le logo et le nom."
Eclipse répond: "OK, on va le renommer Jakarta EE et changer tous les packages."
Résultat:
- Même fonctionnalité
- Nouveau nom de package
- Nouveau départ
Comparaison Javax vs Jakarta
Tableau Comparatif
| Aspect | Javax | Jakarta |
|---|---|---|
| Package | javax.persistence.* | jakarta.persistence.* |
| Spring Boot | 2.x (jusqu'à 2.7.x) | 3.x+ |
| Java | Java 8+ | Java 17+ |
| Statut | Obsolète | Actuel et recommandé |
| Support | Maintenance uniquement | Développement actif |
| Entreprises | Anciennes applications | Nouvelles applications |
Versions Spring Boot
| Spring Boot Version | JPA Package | Java Version |
|---|---|---|
| 2.0 - 2.7.x | javax.persistence | Java 8+ |
| 3.0+ | jakarta.persistence | Java 17+ |
Règle simple:
- Spring Boot 2.x →
javax - Spring Boot 3.x →
jakarta
Migration: Javax → Jakarta
Exemple Complet
Avant (Javax - Spring Boot 2.x)
Fichier: 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
}
Après (Jakarta - Spring Boot 3.x)
Fichier: 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
}
Changement: Remplacer tous les javax par jakarta.
Annotations Affectées
Voici les annotations que vous devrez migrer:
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;
Validation
// 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;
Transactions
// Javax
import javax.transaction.Transactional;
// Jakarta
import jakarta.transaction.Transactional;
Note: Spring fournit aussi @Transactional qui reste identique:
import org.springframework.transaction.annotation.Transactional;
Migration Automatique dans VS Code
Méthode 1: Rechercher et Remplacer
Étape 1: Ouvrez la recherche globale (Ctrl+Shift+F ou Cmd+Shift+F)
Étape 2: Activez le mode Regex (icône .*)
Étape 3: Recherchez:
javax\.persistence
Étape 4: Remplacez par:
jakarta.persistence
Étape 5: Faites de même pour:
javax\.validation
Remplacez par:
jakarta.validation
Méthode 2: Script PowerShell (Windows)
# Naviguer vers votre projet
cd C:\path\to\your\project
# Remplacer javax.persistence par jakarta.persistence
Get-ChildItem -Recurse -Filter *.java | ForEach-Object {
(Get-Content $_.FullName) -replace 'javax\.persistence', 'jakarta.persistence' | Set-Content $_.FullName
}
# Remplacer javax.validation par jakarta.validation
Get-ChildItem -Recurse -Filter *.java | ForEach-Object {
(Get-Content $_.FullName) -replace 'javax\.validation', 'jakarta.validation' | Set-Content $_.FullName
}
Méthode 3: Script Bash (Linux/macOS)
# Naviguer vers votre projet
cd /path/to/your/project
# Remplacer javax.persistence par jakarta.persistence
find . -name "*.java" -type f -exec sed -i '' 's/javax\.persistence/jakarta.persistence/g' {} +
# Remplacer javax.validation par jakarta.validation
find . -name "*.java" -type f -exec sed -i '' 's/javax\.validation/jakarta.validation/g' {} +
Compatibilité avec 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+ (obligatoire)
Imports: jakarta.persistence.*
Résolution des Problèmes Courants
Erreur 1: ClassNotFoundException
Erreur:
java.lang.ClassNotFoundException: javax.persistence.Entity
Cause: Vous utilisez Spring Boot 3.x avec des imports javax.
Solution: Remplacez tous les javax par jakarta.
Erreur 2: NoClassDefFoundError
Erreur:
java.lang.NoClassDefFoundError: jakarta/persistence/Entity
Cause: Vous utilisez Spring Boot 2.x avec des imports jakarta.
Solutions:
Option 1: Mettez à jour vers Spring Boot 3.x
Option 2: Revenez aux imports javax
Erreur 3: Version Java Incorrecte
Erreur:
invalid target release: 17
Cause: Spring Boot 3.x requiert Java 17+, mais vous utilisez Java 11 ou moins.
Solution: Installez Java 17+ et mettez à jour pom.xml:
<properties>
<java.version>17</java.version>
</properties>
Quelle Version Choisir?
Pour Nouveaux Projets
Utilisez Jakarta (Spring Boot 3.x+)
Avantages:
- ✅ Dernières fonctionnalités Spring
- ✅ Support actif
- ✅ Meilleures performances
- ✅ Sécurité à jour
- ✅ Futur-proof
Configuration:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
import jakarta.persistence.*;
Pour Projets Existants
Si Spring Boot 2.x:
- Restez sur
javaxpour l'instant - Planifiez une migration vers Spring Boot 3.x
Si Spring Boot 3.x:
- Migrez immédiatement vers
jakarta
Checklist de Migration
Avant de Migrer
- Vérifiez la version de Spring Boot
- Vérifiez la version de Java (17+ requis)
- Sauvegardez votre code (Git commit)
- Listez toutes les dépendances tierces
Migration
- Mettez à jour
pom.xmlvers Spring Boot 3.x - Mettez à jour Java vers 17+
- Remplacez
javax.persistenceparjakarta.persistence - Remplacez
javax.validationparjakarta.validation - Remplacez
javax.transactionparjakarta.transaction - Mettez à jour les dépendances tierces (si nécessaire)
Après Migration
- Compilez le projet (
mvn clean compile) - Exécutez les tests (
mvn test) - Démarrez l'application (
mvn spring-boot:run) - Testez toutes les fonctionnalités
- Vérifiez les logs pour les warnings
Résumé
Points Clés
✅ Jakarta = Nouveau standard (Spring Boot 3.x+, Java 17+)
✅ Javax = Ancien standard (Spring Boot 2.x, Java 8+)
✅ Migration = Simple (Rechercher/Remplacer)
✅ Toujours utiliser Jakarta pour nouveaux projets
Analogie Finale
Javax = Windows XP 💾
- Fonctionne toujours
- Mais plus de support
Jakarta = Windows 11 🖥️
- Moderne
- Supporté activement
- Recommandé pour le futur
Prochaine Étape
Maintenant que vous comprenez Jakarta vs Javax, passons au Chapitre 3 pour maîtriser Hibernate et les Stratégies DDL.