java - ما الفرق بين JPA و Hibernate؟




java-ee orm (20)

في حين أن JPA هي المواصفات ، فإن Hibernate هو موفر التطبيق الذي يتبع القواعد الموضحة في المواصفات.

أفهم أن JPA 2 هي مواصفة و Hibernate هي أداة لـ ORM. أيضا ، أنا أفهم أن السبات لديه ميزات أكثر من JPA 2. ولكن من الناحية العملية ، ما هو الفرق حقا؟

لدي خبرة في استخدام iBatis والآن أحاول معرفة إما Hibernate أو JPA2. التقطت كتاب Pro JPA2 ويظل يشير إلى "مزود JPA". فمثلا:

إذا كنت تعتقد أن إحدى الميزات يجب أن تكون موحدة ، يجب أن تتحدث وتطلبها من مزود JPA الخاص بك

هذا يربكني لذلك لدي بعض الأسئلة:

  • باستخدام JPA2 بمفرده ، يمكنني إحضار البيانات من DB ببساطة عن طريق شرح نقاط البيع الخاصة بي
  • هل من المفترض استخدام JPA2 مع "موفر JPA" على سبيل المثال TopLink أو Hibernate؟ إذا كان الأمر كذلك ، فما الفائدة من استخدام JPA2 + Hibernate مقارنة بـ JPA2 بمفرده ، أو مقارنة بإسبات Heapnate وحده؟
  • هل يمكن أن ننصح كتاب JPA2 عملي جيد؟ يبدو "المؤيد JPA2" أشبه بالكتاب المقدس والمرجع في JPA2 (لا يدخل في "استعلامات" حتى النصف الأخير من الكتاب). هل هناك كتاب يأخذ منهج مشكلة / حل إلى JPA2؟

JPA هي مواصفات تقوم بتنفيذها في طبقة البيانات الخاصة بك لتنفيذ عمليات db ، والتعيينات OR والمهام الأخرى المطلوبة.

نظرًا لأنها مجرد مواصفات ، فأنت بحاجة إلى أداة لتنفيذها. يمكن أن تكون هذه الأداة إما Hibernate و TopLink و iBatis وبيانات الربيع وما إلى ذلك.

لا تحتاج بالضرورة إلى JPA إذا كنت تستخدم Hibernate في طبقة البيانات الخاصة بك. ولكن إذا كنت تستخدم مواصفات JPA للإسبات ، فستقوم بالتحول إلى أدوات ORM أخرى مثل iBatis ، TopLink سهلة في المستقبل ، لأن المواصفات شائعة للآخرين أيضًا.

* ( إذا كنت تتذكر ، فإنك تقوم import javax.persistence.*; عند استخدام التعليقات التوضيحية لـ OR تعيين (مثلId وColumn وGeneratedValue الخ) في Hibernate ، حيث تستخدم JPA تحت Hibernate ، يمكنك استخدام JPA'sQuery والميزات الأخرى كذلك )


بعض الأشياء يصعب فهمها دون منظور تاريخي للغة وفهم JCP.

في كثير من الأحيان ، هناك أطراف ثالثة تقوم بتطوير حزم تؤدي وظيفة أو تملأ فجوة ليست جزءًا من JDK الرسمي. لأسباب مختلفة ، قد تصبح هذه الوظيفة جزءًا من جافا JDK من خلال JCP (عملية مجتمع جافا)

قدم Hibernate (في 2003) طريقة لتجريد SQL والسماح للمطورين بالتفكير أكثر من حيث الأشياء الثابتة (ORM). تقوم بإعلام السبات عن كائنات الكيان الخاص بك ويقوم تلقائياً بإنشاء الاستراتيجية لاستمرارها. قدم Hibernate تنفيذًا لتنفيذ ذلك وواجهة برمجة التطبيقات لتنفيذ التنفيذ إما عبر تهيئة XML أو التعليقات التوضيحية.

تكمن المشكلة الأساسية الآن في أن الشفرة الخاصة بك تترابط بإحكام مع بائع معين (إسبات) لما اعتقده الكثير من الناس أنه يجب أن يكون أكثر عمومية. ومن هنا الحاجة إلى وجود API استمرارية عام.

في الوقت نفسه ، كان JCP مع الكثير من المدخلات من Hibernate وغيرها من موردي أدوات ORM يقوم بتطوير JSR 220 (طلب مواصفات Java) الذي نتج عنه JPA 1.0 (2006) وفي النهاية JSR 317 وهو JPA 2.0 (2009). هذه هي مواصفات واجهة برمجة تطبيقات Java Persistence العامة. يتم توفير واجهة برمجة التطبيقات (API) في JDK كمجموعة من الواجهات بحيث تعتمد الطبقات الخاصة بك على javax.persistence ولا تقلق بشأن البائع المحدد الذي يقوم بعمل استمرارية الكائنات الخاصة بك. هذه ليست سوى واجهة برمجة التطبيقات وليست التطبيق. أصبح Hibernate الآن واحدًا من العديد من الموردين الذين يقومون بتطبيق مواصفات JPA 2.0. يمكنك التوليف نحو JPA واختيار أي بائع متوافق مع ORM يناسب احتياجاتك.

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

المصدر: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/


JPA هي مواصفات Java API التي تصف إدارة البيانات العلائقية في التطبيقات باستخدام Java Platform. حيث أن Hibernate هي مكتبة ORM (تعيين كائن علائقي) والتي تتبع مواصفات JPA.

يمكنك أن تفكر في JPA كمجموعة من القواعد التي يتم تنفيذها بواسطة Hibernate.


أحاول أن أشرح بكلمات سهلة للغاية.

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

الآن في البيان أعلاه CAR (هي مواصفات) لأن كل سيارة لديها ميزات مشتركة مثل الشيء مع 4 عجلات ويمكن أن تكون مدفوعة على الطريق سيارة ... لذلك مثل JPA. و MERCEDES و BMW و AUDI وغيرها تستخدم فقط ميزة سيارة مشتركة وإضافة وظائف وفقا لقاعدة عملائها بحيث يتم تنفيذ مواصفات السيارة مثل السبات ، iBATIS إلخ.

لذلك من خلال هذه الميزات المشتركة يذهب إلى jpa والإسبات هو مجرد تنفيذ وفقا لحاجة jboss الخاصة بهم.

1 شيء آخر

تتضمن JPA بعض الخصائص الأساسية في المستقبل إذا كنت ترغب في تغيير وضع السبات إلى أي تطبيق آخر يمكنك التبديل بسهولة دون الكثير من الصداع ولهذه الخصائص الأساسية تتضمن تعليقات JPA التي يمكن أن تعمل لأي تقنية تطبيق ، استعلامات JPQL.

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

شكرا لكم


JPA: تمامًا مثل الواجهة وليس لها أي تنفيذ ملموس لها لاستخدام الوظائف الموجودة في JPA.

السبات: هو مجرد موفر JPA الذي يقوم بتنفيذ الوظائف في JPA ويمكن أن يكون له بعض الوظائف الإضافية التي قد لا تكون موجودة في JPA.

نصيحة: يمكنك استخدامها

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

كومبو 1 : يستخدم عندما تشعر أن السبات الخاص بك لا يعطي أداء أفضل ويرغب في تغيير مزود JPA ذلك الوقت ليس من الضروري أن تكتب JPA مرة أخرى. يمكنك كتابة موفر آخر لـ JPA ... ويمكنه تغيير عدد المرات التي يمكنك استخدامها.

كومبو 2 : يستخدم أقل من ذلك بكثير عندما لا تغير مزوّد JPA الخاص بك بأي ثمن.

تفضل بزيارة http://blog-tothought.rhcloud.com//post/2 ، حيث سيتضح لك الارتباك الكامل.


كما تنص على JPA هو مجرد مواصفات ، وهذا يعني عدم وجود التنفيذ. يمكنك وضع تعليقات توضيحية على الفصول الدراسية بقدر ما تريد مع التعليقات التوضيحية لـ JPA ، ولكن بدون تنفيذ لن يحدث أي شيء. فكر في JPA كالتوجيهات التي يجب اتباعها أو واجهة ، في حين أن JPA في Hibernate هو تعليمة برمجية تتوافق مع API كما هو محدد بمواصفات JPA وتوفر وظيفة تحت غطاء المحرك.

عند استخدام Hibernate مع JPA ، فأنت تستخدم بالفعل تطبيق Hibernate JPA. الاستفادة من هذا هو أنه يمكنك مبادلة تطبيق Hibernate لـ JPA لتطبيق آخر لمواصفات JPA. عند استخدام السبات المباشر ، فإنك تقوم بالتأمين في التنفيذ نظرًا لأن البعض الآخر من ORM قد يستخدم أساليب / تهيئات مختلفة للتعليقات ، لذلك لا يمكنك التبديل إلى ORM آخر.

للحصول على وصف أكثر تفصيلاً ، اقرأ إدخالي في المدونة .


JPA هي الواجهة بينما يتم تنفيذ Hibernate.

تقليديا هناك العديد من حلول Java ORM:

كل تطبيق يحدد تعريف التعيين الخاص به أو API العميل. جمعت مجموعة خبراء JPA أفضل ما في هذه الأدوات ، ولذلك قاموا بإنشاء واجهة برمجة تطبيقات Java Persistence API.

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

دفعت JPA القياسية منافسة Java ORM إلى مستوى جديد وهذا لا يمكن إلا أن يؤدي إلى تطبيقات أفضل.

كما هو موضح في كتابي ، "استمرارية جافا عالية الأداء" ، يقدم Hibernate ميزات لا تدعمها JPA :

تسمح هذه الميزات الإضافية لـ Hibernate بمعالجة العديد من متطلبات الثبات التي تتطلبها تطبيقات المؤسسات الكبيرة.


السبات هو مزود JPA.

الصفحة JPA Vs Hibernate بقلم كريشنا سرينيفاسان تقول:

JPA هي مواصفة للوصول إلى البيانات واستمرارها وإدارتها بين كائنات Java وقاعدة البيانات العلائقية. كما يقول التعريف API لها ، فهي فقط المواصفات. لا يوجد تطبيق لـ API. تحدد JPA مجموعة القواعد والإرشادات لتطوير الواجهات التي تلي المعايير. مباشرة إلى النقطة: JPA هي مجرد إرشادات لتنفيذ مخطط كائن علمي (ORM) ولا يوجد رمز أساسي للتنفيذ. حيث إن ، السبات هو التنفيذ الفعلي لإرشادات JPA. عندما يقوم السبات بتنفيذ مواصفات JPA ، فسيتم اعتماد ذلك من قبل مجموعة JPA عند اتباع جميع المعايير المذكورة في المواصفات. على سبيل المثال ، ستوفر إرشادات JPA معلومات حول الميزات الإلزامية والاختيارية ليتم تنفيذها كجزء من تنفيذ JPA.


JPA عبارة عن واجهة برمجة تطبيقات (API) ، والتي تنفّذها إسبات السبات. يسبق إسبات JPA. قبل JPA ، تقوم بكتابة رمز السبات الأصلي للقيام ORM الخاص بك. JPA هو مجرد واجهة ، لذلك الآن يمكنك كتابة رمز JPA وتحتاج إلى العثور على التنفيذ. السبات يحدث ليكون التنفيذ.

لذا اختياراتك هي: السبات ، الفاصل ، الخ ...

تكمن ميزة JPA في أنها تسمح لك باستبدال التنفيذ إذا لزم الأمر. العيب هو أن واجهة برمجة تطبيقات السبات / toplink / etc ... الأصلية قد توفر وظيفة لا تدعمها مواصفات JPA.


JPA هي مجرد مواصفات في حين أن Hibernate هي واحدة من مزود JPA أي أن السبات يقوم بتنفيذ العديد من الأشياء المذكورة في عقد JPA.


التحدث المجازي JPA هو مجرد واجهة ، Hibernate / TopLink - فئة (أي تطبيق واجهة).

يجب أن يكون لديك واجهة تنفيذ لاستخدام الواجهة. ولكن يمكنك استخدام الطبقة من خلال الواجهة ، أي استخدام Hibernate من خلال JPA API أو يمكنك استخدام التطبيق مباشرة ، أي استخدام Hibernate مباشرة ، وليس من خلال JPA API النقي.

كتاب جيد عن JPA هو "استمرارية جافا عالية الأداء" من فلاد ميهالسيا.


JPA هو JSR ie متطلبات مواصفات Java لتطبيق مخطط كائن علمي والذي لا يحتوي على كود محدد لتطبيقه. إنه يحدد مجموعة معينة من القواعد من أجل الوصول إلى البيانات واستمرارها وإدارتها بين كائنات جافا وقاعدة البيانات ذات الصلة مع تقديمها ، تم استبدال EJB حيث تم انتقادها لكونها ذات وزن ثقيل من قبل مجتمع مطوري جافا. السبات هو واحد من الطريقة التي يمكن تنفيذها JPA باستخدام المبادئ التوجيهية الشركة المصرية للاتصالات. Hibernate هي خدمة استمارية واستعلامات عالية الأداء / ذات علاقة والتي تم ترخيصها بموجب ترخيص GNU Lesser General Public License (LGPL) مفتوح المصدر. يمكن أن تبطل تنفيذ JP من JPA لتنفيذ آخر لمواصفات JPA. عند استخدام السبات المباشر ، فإنك تقوم بالتأمين في التنفيذ نظرًا لأن البعض الآخر قد يستخدم طرقًا / تهيئات مختلفة وشروحًا ، لذلك لا يمكنك التبديل إلى ORM آخر.


JPA هي مجرد مواصفات تحتاج إلى تنفيذ ملموس. التطبيق الافتراضي المقدم من oracle هو "Eclipselink" الآن. يتم التبرع Toplink بواسطة Oracle لمؤسسة Eclipse للدمج مع eclipselink.

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

تنفيذ JPA آخر هو OpenJPA ، وهو امتداد لتنفيذ Kodo.

JPA مقابل السبات


JPA هي الواجهة ، ويعد Hibernate تطبيقًا واحدًا لتلك الواجهة.


JPA هو مجرد مواصفات. في السوق هناك العديد من البائعين التي تنفذ JPA. أنواع مختلفة من الموردين تنفيذ JPA بطريقة مختلفة. توفر أنواع مختلفة من الموردين وظائف مختلفة لذلك اختر البائع المناسب بناءً على متطلباتك.

إذا كنت تستخدم Hibernate أو أي مورّدين آخرين بدلاً من JPA مما لا يمكنك الانتقال بسهولة إلى وضع الإسبات إلى EclipseLink أو OpenJPA إلى Hibernate.But إذا كنت تستخدم JPA من أن تضطر إلى تغييرها فقط في تقديم ملف XML الاستمرالي ، فيمكن بسهولة الترحيل في نقابة الصحفيين.


JPA هي الرقص ، السبات هو الراقص.


JPA أو Java Persistence API هي مواصفات قياسية لتطبيقات ORM بينما السبات هو تطبيق ORM الفعلي أو إطار العمل.


JPA هو Java Persistence API. الذي يحدد فقط مواصفات واجهات برمجة التطبيقات. يعني أن مجموعة القواعد والإرشادات لإنشاء واجهات برمجة التطبيقات. إذا كان يقول سياقًا آخر ، فهو عبارة عن مجموعة من المعايير التي توفر المجمّع لإنشاء واجهات برمجة التطبيقات هذه ، يمكن استخدامها للوصول إلى كائن الكيان من قاعدة البيانات. يتم توفير JPA بواسطة oracle.عندما سنقوم بالوصول إلى قاعدة البيانات ، نحن بالتأكيد بحاجة إلى تنفيذها. وسائل JPA تحدد فقط إرشادات لتنفيذ واجهات برمجة التطبيقات. Hibernate هو موفر / مورّد JPA مسؤول عن تنفيذ واجهات برمجة التطبيقات. مثل Hibernate TopLink و Open JPA هي بعض الأمثلة على موفري API لـ JPA. لذلك نحن نستخدم APIs القياسية المحددة JPA من خلال السبات.


في كثير من الأحيان ، أدركت أن تذكر المفاهيم الأساسية لأي لغة يمكن تحقيقها عن طريق إنشاء تشابهات في العالم الحقيقي. هنا تشبيهي لفهم معدّلات الوصول في Java:

لنفترض أنك طالب في جامعة ولديك صديق قادم لزيارتك خلال عطلة نهاية الأسبوع. لنفترض وجود تمثال كبير لمؤسس الجامعة في وسط الحرم الجامعي.

  • عندما تحضره إلى الحرم الجامعي ، فإن أول شيء تراه أنت وصديقك هو هذا التمثال. هذا يعني أن أي شخص يمشي في الحرم الجامعي يمكنه أن ينظر إلى التمثال دون إذن من الجامعة. هذا يجعل التمثال PUBLIC .

  • بعد ذلك ، تريد أن تأخذ صديقك إلى المبنى الخاص بك ، ولكن لذلك تحتاج إلى تسجيله كزائر. هذا يعني أنه يحصل على تصريح دخول (وهو نفس تصريح دخولك) للوصول إلى المباني المختلفة في الحرم الجامعي. وهذا من شأنه أن يجعل بطاقة الوصول الخاصة به محمية .

  • يريد صديقك تسجيل الدخول إلى شبكة Wi-Fi داخل الحرم الجامعي ولكن ليس لديه أي بيانات اعتماد للقيام بذلك. الطريقة الوحيدة التي يمكنه من خلالها الاتصال بالإنترنت هي إذا كنت تشارك تسجيل الدخول معه. (تذكر أن كل طالب يذهب إلى الجامعة يمتلك أيضًا بيانات اعتماد تسجيل الدخول). هذا من شأنه أن يجعل أوراق اعتماد تسجيل الدخول الخاصة بك مثل NO MODIFIER .

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

أتمنى أن يساعدك هذا!





java hibernate jpa java-ee orm