MODULE 6 - Spring Data JPA المتقدم
مرحبًا بكم في الوحدة 6! 🎯
في الوحدة 2، تعلمتم أساسيات Spring Data JPA: الطرق الأربعة لـ CRUD (save, findById, findAll, deleteById) و3 كلمات مفتاحية بسيطة (findBy, And, Or).
الآن، أنتم مستعدون للذهاب إلى أبعد من ذلك!
هذه الوحدة تعلمكم المفاهيم المتقدمة لـ JPA لإنشاء استعلامات معقدة وإدارة العلاقات بين الكيانات.
🎓 أهداف التعلم
في نهاية هذه الوحدة، ستكونون قادرين على:
- ✅ استخدام أكثر من 15 كلمة مفتاحية لـ Spring Data JPA
- ✅ إنشاء استعلامات مخصصة باستخدام @Query
- ✅ إدارة العلاقات (@OneToMany, @ManyToOne, @ManyToMany)
- ✅ استخدام الترقيم والفرز
- ✅ تحسين أداء الاستعلامات
📚 المتطلبات الأساسية
قبل أن تبدأوا هذه الوحدة، يجب أن تكونوا قد:
- ✅ أكملتم الوحدات من 1 إلى 4
- ✅ أتقنتم أساسيات JPA (الوحدة 2، الفصل 5)
- ✅ فهمتم المستودعات (
JpaRepository)
إذا لم يتم تحقيق هذه المتطلبات، عودوا إلى الوحدة 2!
🗺️ خطة الوحدة
الجزء النظري (4 فصول)
الفصل 1: اتفاقيات التسمية المتقدمة
المدة: 1 ساعة
المحتوى:
- أكثر من 15 كلمة مفتاحية لـ Spring Data JPA
- Between, LessThan, GreaterThan
- Like, StartingWith, EndingWith, Containing
- In, NotIn, IsNull, IsNotNull
- True, False, IgnoreCase
- أمثلة عملية لكل كلمة مفتاحية
لماذا هو مهم؟ إنشاء استعلامات معقدة دون كتابة SQL
الفصل 2: العلاقات بين الكيانات
المدة: 1 ساعة و30 دقيقة
المحتوى:
- @OneToOne (1-1)
- @OneToMany و@ManyToOne (1-N)
- @ManyToMany (N-N)
- أنواع الجلب (LAZY vs EAGER)
- عمليات الكاسكيد
- العلاقات ثنائية الاتجاه
لماذا هو مهم؟ نمذجة بيانات حقيقية معقدة
الفصل 3: استعلامات مخصصة باستخدام @Query
المدة: 1 ساعة
المحتوى:
- صياغة JPQL
- @Query مع JPQL
- @Query مع SQL الأصلي
- المعلمات المسماة مع @Param
- الاستعلامات المسماة
- الاستعلامات الديناميكية
لماذا هو مهم؟ الذهاب إلى ما بعد اتفاقيات التسمية
الفصل 4: الترقيم والأداء
المدة: 1 ساعة
المحتوى:
- Pageable و
Page<T> - الفرز والفرز متعدد المعايير
- مشكلة N+1
- استراتيجيات الجلب
- الإسقاطات
- تحسين الاستعلام
لماذا هو مهم؟ إنشاء تطبيقات ذات أداء عالٍ
الجزء العملي (3 تدريبات)
TP6.1: اتفاقيات متقدمة
المدة: 2 ساعة
الهدف: إتقان أكثر من 15 كلمة مفتاحية
ستقومون بإنشاء:
- كيان Product مع العديد من الحقول
- 20 طريقة مستودع باستخدام الكلمات المفتاحية
- اختبارات لكل طريقة
TP6.2: علاقات Employee-Department
المدة: 2 ساعة
الهدف: إدارة العلاقات بين الكيانات
ستقومون بإنشاء:
- كيانات Employee وDepartment (OneToMany/ManyToOne)
- CRUD كامل مع العلاقات
- عمليات الكاسكيد
- اختبارات للعلاقات
TP6.3: تمرين Airport-Flight-Passenger
المدة: 2 ساعة و30 دقيقة
الهدف: تقييم كامل
ستقومون بـ:
- نمذجة 3 كيانات مرتبطة
- تنفيذ 20 استعلام (سهل، متوسط، صعب)
- توفير الحل
- التصحيح الذاتي
📊 المدة الإجمالية
| النوع | المدة |
|---|---|
| النظرية | 4 ساعات و30 دقيقة (4 فصول) |
| العملي | 6 ساعات و30 دقيقة (3 تدريبات) |
| الإجمالي | 11 ساعة (~3-4 جلسات) |
🎯 ما ستتعلمونه
قبل الوحدة 6
// كنتم تعرفون القيام بذلك:
public interface ProductRepository extends JpaRepository<Product, Long> {
List<Product> findByName(String name);
List<Product> findByNameAndPrice(String name, Double price);
}
محدود إلى: استعلامات بسيطة مع And وOr
بعد الوحدة 6
// ستعرفون القيام بكل هذا:
public interface ProductRepository extends JpaRepository<Product, Long> {
// المقارنات
List<Product> findByPriceBetween(Double min, Double max);
List<Product> findByPriceLessThan(Double maxPrice);
List<Product> findByPriceGreaterThanEqual(Double minPrice);
// البحث النصي
List<Product> findByNameContaining(String keyword);
List<Product> findByNameStartingWith(String prefix);
List<Product> findByDescriptionLike(String pattern);
// القوائم والفراغات
List<Product> findByCategoryIn(List<String> categories);
List<Product> findByDiscountIsNull();
List<Product> findByActiveTrue();
// الفرز والترقيم
Page<Product> findByCategory(String category, Pageable pageable);
// استعلامات مخصصة
@Query("SELECT p FROM Product p WHERE p.price < :maxPrice")
List<Product> findCheapProducts(@Param("maxPrice") Double maxPrice);
// SQL الأصلي
@Query(value = "SELECT * FROM products WHERE stock < 10", nativeQuery = true)
List<Product> findLowStock();
}
ستتقنون: استعلامات معقدة، علاقات، أداء!
🚀 لماذا هذه الوحدة مهمة
1. استعلامات حقيقية في الإنتاج
في الشركات، لن تقوموا فقط بـ findAll(). ستحتاجون إلى:
// العثور على طلبات عميل خلال آخر 30 يومًا
List<Order> findByCustomerIdAndOrderDateAfter(Long customerId, LocalDate date);
// المنتجات التي نفدت من المخزون في فئة معينة
List<Product> findByCategoryAndStockLessThan(String category, Integer minStock);
// الموظفون في قسم براتب ضمن نطاق معين
List<Employee> findByDepartmentAndSalaryBetween(Department dept, Double min, Double max);
هذه الوحدة تجهزكم للواقع!
2. أداء التطبيقات
مشكلة شائعة: مشكلة N+1
// ❌ ممارسة سيئة - N+1 استعلامات!
List<Department> departments = departmentRepo.findAll(); // 1 استعلام
for (Department dept : departments) {
List<Employee> employees = dept.getEmployees(); // N استعلامات!
// ...
}
الحل الذي ستتعلمونه:
// ✅ ممارسة جيدة - استعلام واحد فقط!
@Query("SELECT d FROM Department d JOIN FETCH d.employees")
List<Department> findAllWithEmployees();
هذه الوحدة تعلمكم كيفية كتابة كود ذو أداء عالٍ!
3. نمذجة بيانات معقدة
حالة حقيقية: التجارة الإلكترونية
Customer ──< Order >── Product
│
└──> Payment
ستتعلمون كيفية:
- نمذجة هذه العلاقات
- إدارة الكاسكيد (حذف عميل → طلباته؟)
- تحسين الاستعلامات
- إدارة البيانات اليتيمة
🗺️ التقدم في التدريب
الوحدة 2: أساسيات JPA (4 طرق، 3 كلمات مفتاحية بسيطة)
↓
الوحدة 6: ← أنتم هنا - JPA المتقدم
(15+ كلمات مفتاحية، علاقات، @Query، أداء)
↓
المشاريع: تطبيقات كاملة مع قواعد بيانات معقدة
الوحدة 6 = أن تصبحوا خبراء في Spring Data JPA!
📖 كيفية التعامل مع هذه الوحدة
الطريقة الموصى بها
-
اقرأوا الفصول بالترتيب
- الفصل 1: الاتفاقيات (15+ كلمات مفتاحية)
- الفصل 2: العلاقات (OneToMany, ManyToOne, إلخ)
- الفصل 3: @Query (JPQL، SQL الأصلي)
- الفصل 4: الأداء (الترقيم، التحسين)
-
نفذوا التدريبات تدريجيًا
- TP6.1: ممارسة الاتفاقيات (2 ساعة)
- TP6.2: ممارسة العلاقات (2 ساعة)
- TP6.3: تقييم كامل (2 ساعة و30 دقيقة)
-
اختبروا كل الكود
- لا تنسخوا، اكتبوا الكود
- اختبروا كل استعلام
- افهموا النتائج
الوقت الموصى به
الخيار المكثف (عطلة نهاية أسبوع واحدة):
- السبت: الفصول 1-2 + TP6.1
- الأحد: الفصول 3-4 + TP6.2 + TP6.3
الخيار التدريجي (3 جلسات):
- الجلسة 1: الفصول 1-2 + TP6.1
- الجلسة 2: الفصل 3 + TP6.2
- الجلسة 3: الفصل 4 + TP6.3
✅ التقييم الذاتي
قبل أن تبدأوا، اختبروا معرفتكم:
- هل تعرفون كيفية إنشاء طريقة
findByPriceBetween؟ ☐ نعم ☐ لا - هل تعرفون @OneToMany و@ManyToOne؟ ☐ نعم ☐ لا
- هل تعرفون كيفية استخدام @Query؟ ☐ نعم ☐ لا
- هل تفهمون مشكلة N+1؟ ☐ نعم ☐ لا
- هل تعرفون كيفية ترقيم النتائج؟ ☐ نعم ☐ لا
إذا أجبتم "لا" على سؤالين أو أكثر → هذه الوحدة ضرورية لكم!
بعد الوحدة، أعدوا هذا الاختبار. يجب أن تجيبوا "نعم" في كل مكان!
🎯 الخطوة التالية
مستعدون لتصبحوا خبراء في Spring Data JPA؟
➡️ ابدأوا مع الفصل 1: اتفاقيات التسمية المتقدمة