Aller au contenu principal

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​

AspectJavaxJakarta
Packagejavax.persistence.*jakarta.persistence.*
Spring Boot2.x (jusqu'à 2.7.x)3.x+
JavaJava 8+Java 17+
StatutObsolèteActuel et recommandé
SupportMaintenance uniquementDéveloppement actif
EntreprisesAnciennes applicationsNouvelles applications

Versions Spring Boot​

Spring Boot VersionJPA PackageJava Version
2.0 - 2.7.xjavax.persistenceJava 8+
3.0+jakarta.persistenceJava 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 javax pour 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.xml vers Spring Boot 3.x
  • Mettez à jour Java vers 17+
  • Remplacez javax.persistence par jakarta.persistence
  • Remplacez javax.validation par jakarta.validation
  • Remplacez javax.transaction par jakarta.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.

➡️ Chapitre 3: Hibernate DDL

⬅️ Chapitre précédent: PostgreSQL

⬅️ Retour au Module 4