مقدمة
المطابقة بين الكائنات والجداول العلائقية، والمواصفة في مقابل التنفيذ، وفخ مشكلة الاستعلامات N+1.
مقدمة في JPA وHibernate
تفكر قاعدة البيانات العلائقية بلغة الصفوف والأعمدة والمفاتيح الأجنبية، أما برنامج Java فيفكر بلغة الكائنات والمراجع والوراثة. هذان النموذجان لا يتطابقان: المرجع في Java مؤشر في الذاكرة، والمفتاح الأجنبي قيمة منسوخة؛ والكائن في Java يمكنه أن يرث، أما الجدول فلا. يُعرف هذا الفارق باسم object-relational impedance mismatch، وكل ما كنتم تفعلونه يدويًا مع JDBC، من نسخ الأعمدة إلى الحقول، وإيجاد كائن سبق تحميله لتفادي تكراره، وتحديد وقت الكتابة، إنما هو سعي لسد هذه الفجوة.
JPA هي الجواب المعياري الذي قدمته منصة Jakarta EE لهذه المشكلة. أما Hibernate فهو أكثر تنفيذاتها انتشارًا، وهو كذلك الأقدم بفارق كبير: فقد وُجد Hibernate قبل JPA، وصُمّمت JPA في معظمها انطلاقًا منه. والنتيجة بالنسبة إليكم أداة ORM تتيح لكم كتابة commande.getClient().getNom() بدل كتابة جملة ربط، وتقرر بنفسها متى يُرسَل أمر UPDATE إلى PostgreSQL.
وهذا التفويض تحديدًا هو ما يجعل الموضوع صعبًا. فأداة ORM لا تلغي SQL، بل تنتجه نيابةً عنكم. فإذا أصدرت صفحة تعرض خمسين طلبًا واحدًا وخمسين استعلامًا بدل استعلامين، فالمشكلة ليست في شيفرتكم، بل في قرار اتخذه Hibernate استنادًا إلى تعليقات توضيحية (annotations) كتبتموها دون تقدير أثرها. هذه الدورة مبنية حول هذا السيناريو الذي يُسمى مشكلة الاستعلامات N+1. يظهر في هذا الدرس، ويقع أمام أعينكم في درس العلاقات، ويُحل حلًا سليمًا في درس التحسين.
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش