انتقل إلى المحتوى الرئيسي

الفصل 2: جاكرتا مقابل جافاكس Persistence

مقدمة​

إذا كنت قد شاهدت كود Spring Boot عبر الإنترنت، فمن المحتمل أنك رأيت نوعين مختلفين من الاستيرادات:

import javax.persistence.*;  // قديم
import jakarta.persistence.*; // جديد

السؤال: ما الفرق؟ أيهما يجب استخدامه؟

الإجابة القصيرة: استخدم جاكرتا (jakarta.persistence) لجميع مشاريعك الجديدة مع Spring Boot 3.x+.


التاريخ: Java EE → Jakarta EE​

الانتقال​

قبل 2019: Java EE (الحزم javax.*)

كانت Oracle تملك Java EE (Java Enterprise Edition)، والتي تضمنت JPA (Java Persistence API).

بعد 2019: Jakarta EE (الحزم jakarta.*)

نقلت Oracle Java EE إلى مؤسسة Eclipse، التي أعادت تسميته إلى Jakarta EE.

المشكلة القانونية: كانت Oracle تمتلك حقوق الاسم javax، لذا كان على Eclipse إنشاء مساحة أسماء جديدة: jakarta.


التشبيه​

تخيل أن شركة (Oracle) تبيع قسمها (Java EE) إلى شركة أخرى (Eclipse Foundation).

تقول Oracle: "يمكنك الحصول على المنتج، ولكن ليس الشعار والاسم."

ترد Eclipse: "حسنًا، سنعيد تسميته إلى Jakarta EE ونغير جميع الحزم."

النتيجة:

  • نفس الوظيفة
  • اسم حزمة جديد
  • بداية جديدة

مقارنة Javax مقابل Jakarta​

جدول مقارنة​

الجانبJavaxJakarta
الحزمةjavax.persistence.*jakarta.persistence.*
Spring Boot2.x (حتى 2.7.x)3.x+
JavaJava 8+Java 17+
الحالةمهملحالي وموصى به
الدعمصيانة فقطتطوير نشط
الشركاتالتطبيقات القديمةالتطبيقات الجديدة

إصدارات Spring Boot​

إصدار Spring Bootحزمة JPAإصدار Java
2.0 - 2.7.xjavax.persistenceJava 8+
3.0+jakarta.persistenceJava 17+

قاعدة بسيطة:

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

الانتقال: Javax → Jakarta​

مثال كامل​

قبل (Javax - Spring Boot 2.x)​

الملف: 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
}

بعد (Jakarta - Spring Boot 3.x)​

الملف: 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
}

التغيير: استبدل جميع javax بـ jakarta.


التعليقات المتأثرة​

إليك التعليقات التي ستحتاج إلى نقلها:

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;

التحقق​

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

المعاملات​

// Javax
import javax.transaction.Transactional;

// Jakarta
import jakarta.transaction.Transactional;

ملاحظة: يوفر Spring أيضًا @Transactional التي تبقى كما هي:

import org.springframework.transaction.annotation.Transactional;

الانتقال التلقائي في VS Code​

الطريقة 1: البحث والاستبدال​

الخطوة 1: افتح البحث العام (Ctrl+Shift+F أو Cmd+Shift+F)

الخطوة 2: فعّل وضع Regex (أيقونة .*)

الخطوة 3: ابحث عن:

javax\.persistence

الخطوة 4: استبدل بـ:

jakarta.persistence

الخطوة 5: افعل نفس الشيء لـ:

javax\.validation

استبدل بـ:

jakarta.validation

الطريقة 2: سكربت PowerShell (ويندوز)​

# الانتقال إلى مشروعك
cd C:\path\to\your\project

# استبدال javax.persistence بـ jakarta.persistence
Get-ChildItem -Recurse -Filter *.java | ForEach-Object {
(Get-Content $_.FullName) -replace 'javax\.persistence', 'jakarta.persistence' | Set-Content $_.FullName
}

# استبدال javax.validation بـ jakarta.validation
Get-ChildItem -Recurse -Filter *.java | ForEach-Object {
(Get-Content $_.FullName) -replace 'javax\.validation', 'jakarta.validation' | Set-Content $_.FullName
}

الطريقة 3: سكربت Bash (لينكس/macOS)​

# الانتقال إلى مشروعك
cd /path/to/your/project

# استبدال javax.persistence بـ jakarta.persistence
find . -name "*.java" -type f -exec sed -i '' 's/javax\.persistence/jakarta.persistence/g' {} +

# استبدال javax.validation بـ jakarta.validation
find . -name "*.java" -type f -exec sed -i '' 's/javax\.validation/jakarta.validation/g' {} +

التوافق مع 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، أو 17
الاستيرادات: 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+ (إجباري)
الاستيرادات: jakarta.persistence.*


حل المشاكل الشائعة​

الخطأ 1: ClassNotFoundException​

الخطأ:

java.lang.ClassNotFoundException: javax.persistence.Entity

السبب: تستخدم Spring Boot 3.x مع استيرادات javax.

الحل: استبدل جميع javax بـ jakarta.


الخطأ 2: NoClassDefFoundError​

الخطأ:

java.lang.NoClassDefFoundError: jakarta/persistence/Entity

السبب: تستخدم Spring Boot 2.x مع استيرادات jakarta.

الحلول:

الخيار 1: قم بالتحديث إلى Spring Boot 3.x

الخيار 2: عد إلى استيرادات javax


الخطأ 3: إصدار Java غير صحيح​

الخطأ:

invalid target release: 17

السبب: يتطلب Spring Boot 3.x Java 17+، لكنك تستخدم Java 11 أو أقل.

الحل: قم بتثبيت Java 17+ وقم بتحديث pom.xml:

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

أي إصدار تختار؟​

للمشاريع الجديدة​

استخدم جاكرتا (Spring Boot 3.x+)

المزايا:

  • ✅ أحدث ميزات Spring
  • ✅ دعم نشط
  • ✅ أداء أفضل
  • ✅ أمان محدث
  • ✅ مستعد للمستقبل

التكوين:

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

للمشاريع القائمة​

إذا كان Spring Boot 2.x:

  • ابق على javax في الوقت الحالي
  • خطط للانتقال إلى Spring Boot 3.x

إذا كان Spring Boot 3.x:

  • انتقل فورًا إلى jakarta

قائمة التحقق من الانتقال​

قبل الانتقال​

  • تحقق من إصدار Spring Boot
  • تحقق من إصدار Java (17+ مطلوب)
  • احفظ الكود الخاص بك (Git commit)
  • قم بإعداد قائمة بجميع التبعيات الخارجية

الانتقال​

  • قم بتحديث pom.xml إلى Spring Boot 3.x
  • قم بتحديث Java إلى 17+
  • استبدل javax.persistence بـ jakarta.persistence
  • استبدل javax.validation بـ jakarta.validation
  • استبدل javax.transaction بـ jakarta.transaction
  • قم بتحديث التبعيات الخارجية (إذا لزم الأمر)

بعد الانتقال​

  • قم بتجميع المشروع (mvn clean compile)
  • قم بتشغيل الاختبارات (mvn test)
  • ابدأ التطبيق (mvn spring-boot:run)
  • اختبر جميع الميزات
  • تحقق من السجلات للعثور على التحذيرات

الملخص​

النقاط الرئيسية​

✅ جاكرتا = المعيار الجديد (Spring Boot 3.x+, Java 17+)
✅ جافاكس = المعيار القديم (Spring Boot 2.x, Java 8+)
✅ الانتقال = بسيط (بحث/استبدال)
✅ استخدم دائمًا جاكرتا للمشاريع الجديدة


التشبيه النهائي​

جافاكس = ويندوز XP 💾

  • لا يزال يعمل
  • لكن لا يوجد دعم

جاكرتا = ويندوز 11 🖥️

  • حديث
  • مدعوم بنشاط
  • موصى به للمستقبل

الخطوة التالية​

الآن بعد أن فهمت جاكرتا مقابل جافاكس، دعنا ننتقل إلى الفصل 3 لإتقان Hibernate واستراتيجيات DDL.

➡️ الفصل 3: Hibernate DDL

⬅️ الفصل السابق: PostgreSQL

⬅️ العودة إلى الوحدة 4