java - ما الفرق بين واجهات CrudRepository و JpaRepository في Spring Data JPA؟




spring-data spring-data-jpa (2)

ما هو الفرق بين واجهات JpaRepository و JpaRepository في Spring Data JPA؟

عندما أرى الأمثلة على الويب ، أراهم هناك يستخدمون نوعًا ما بالتبادل. ما الفرق بينهم؟ لماذا تريد استخدام واحد على الآخر؟


الجواب كين هو الصحيح في الأساس ولكن أود أن تتناغم على "لماذا تريد استخدام واحد على الآخر؟" جزء من سؤالك.

مبادئ

تحتوي الواجهة الأساسية التي تختارها لمستودعك على غرضين رئيسيين. أولاً ، تسمح بنية تخزين مستودع بيانات الربيع بالبحث عن الواجهة الخاصة بك وتشغيل عملية إنشاء الوكيل بحيث تقوم بحقن مثيلات الواجهة في العملاء. الهدف الثاني هو جذب أكبر قدر ممكن من الوظائف في الواجهة دون الحاجة إلى إعلان طرق إضافية.

واجهات مشتركة

تشحن مكتبة Spring Data الأساسية مع واجهتين أساسيتين تعرضان مجموعة مخصصة من الوظائف:

  • CrudRepository - طرق CRUD
  • PagingAndSortingRepository - طرق ترقيم الصفحات والفرز (تمتد CrudRepository )

واجهات تخزين محددة

تعرض وحدات التخزين الفردية (على سبيل المثال JPA أو MongoDB) ملحقات خاصة بالتخزين من هذه الواجهات الأساسية للسماح بالوصول إلى وظائف خاصة بالمخزن مثل التنظيف أو التجميع المخصص الذي يأخذ بعض تفاصيل المتجر في الاعتبار. مثال على ذلك هو deleteInBatch(…) من JpaRepository والذي يختلف عن delete(…) لأنه يستخدم استعلام لحذف الكيانات المعينة الأكثر أداءً ولكن يأتي مع التأثير الجانبي لعدم تشغيل الشلالات المحددة لـ JPA (مثل المواصفات يحدد ذلك).

نوصي بشكل عام بعدم استخدام هذه الواجهات الأساسية لأنها تعرض تقنية الثبات الأساسية للعملاء ، وبالتالي تشديد اقتران بينها وبين المستودع. بالإضافة إلى ذلك ، تحصل على بعض الشيء من التعريف الأصلي للمستودع الذي هو في الأساس "مجموعة من الكيانات". لذلك إذا استطعت ، PagingAndSortingRepository مع PagingAndSortingRepository .

واجهات قاعدة المخزون المخصصة

الجانب السلبي مباشرة اعتمادا على واحدة من واجهات قاعدة المقدمة هو شقين. يمكن اعتبار كلاهما نظريًا ولكني أعتقد أنه من المهم أن تكون على دراية بما يلي:

  1. بالاعتماد على واجهة مستودع بيانات الربيع يربط واجهة المستودع الخاصة بك بالمكتبة. لا أعتقد أن هذه مشكلة معينة ، حيث قد تستخدم على الأرجح التجريدات مثل Page أو Pageable في الشفرة على أي حال. لا تختلف Spring Data عن أي مكتبة أخرى للأغراض العامة مثل commons-lang أو Guava. طالما أنها توفر فائدة معقولة ، فلا بأس.
  2. من خلال توسيع CrudRepository ، على سبيل المثال ، يمكنك الكشف عن مجموعة كاملة من طريقة الاستمرار في وقت واحد. من المحتمل أن يكون هذا جيدًا في معظم الحالات أيضًا ، ولكن قد تواجهك حالات تريد فيها اكتساب المزيد من التحكم الدقيق في طرق الكشف ، على سبيل المثال إنشاء ReadOnlyRepository التي لا تتضمن save(…) delete(…) طرق CrudRepository .

الحل لكل من هذه الجوانب السلبية هو إنشاء واجهة مستودع قاعدة خاصة بك أو حتى مجموعة منها. في الكثير من التطبيقات ، رأينا شيئًا كهذا:

interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }

interface ReadOnlyRepository<T> extends Repository<T, Long> {

  // Al finder methods go here
}

تعد واجهة المستودع الأولى عبارة عن واجهة بسيطة للأغراض العامة تعمل في الواقع على إصلاح النقطة 1 فقط ولكنها تربط أيضًا نوع المعرف ليكون Long أجل التناسق. تحتوي الواجهة الثانية عادةً على كافة طرق find…(…) تم نسخها من CrudRepository و PagingAndSortingRepository ولكن لا تعرض تلك التي يتم التلاعب بها. اقرأ المزيد عن هذا النهج في الوثائق المرجعية .

الملخص - tl؛

يسمح لك تجريد المستودع بإحضار المستودع الأساسي مدفوع بالكامل باحتياجاتك المعمارية والوظيفية. استخدام تلك المقدمة من خارج منطقة الجزاء إذا كانت تناسبها ، صياغة واجهات قاعدة المخزون الخاصة بك إذا لزم الأمر. ابق بعيدا عن واجهات مستودع تخزين محددة ما لم يكن لا مفر منه.


JpaRepository يمتد PagingAndSortingRepository والذي بدوره يمتد CrudRepository .

وظائفها الرئيسية هي:

  • يوفر CrudRepository أساسا وظائف CRUD.
  • يوفر PagingAndSortingRepository طرقًا لإجراء ترقيم الصفحات وفرز السجلات.
  • يوفر JpaRepository بعض طرق JPA ذات الصلة مثل مسح سياق المثابرة وحذف السجل في مجموعة.

بسبب الميراث المذكور أعلاه ، فإن JpaRepository سيكون لها جميع وظائف CrudRepository و PagingAndSortingRepository . لذلك إذا لم تكن بحاجة إلى المستودع للحصول على الوظائف التي يوفرها JpaRepository و PagingAndSortingRepository ، فاستخدم CrudRepository .





spring-data-jpa