الفصل 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
جدول مقارنة
| الجانب | Javax | Jakarta |
|---|---|---|
| الحزمة | javax.persistence.* | jakarta.persistence.* |
| Spring Boot | 2.x (حتى 2.7.x) | 3.x+ |
| Java | Java 8+ | Java 17+ |
| الحالة | مهمل | حالي وموصى به |
| الدعم | صيانة فقط | تطوير نشط |
| الشركات | التطبيقات القديمة | التطبيقات الجديدة |
إصدارات Spring Boot
| إصدار Spring Boot | حزمة JPA | إصدار Java |
|---|---|---|
| 2.0 - 2.7.x | javax.persistence | Java 8+ |
| 3.0+ | jakarta.persistence | Java 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.