0%
العلاقات بين الكيانات

العلاقات

حيث يتوقف SQL المولَّد عن كونه بديهيًا، وحيث تولد مشكلة N+1.

15-20 دقيقة

العلاقات بين الكيانات

الكيان المعزول مجرد تمرين. أما العمل الحقيقي فيبدأ حين تُحيل الكيانات بعضها إلى بعض: مؤلف لديه كتب، وطلبية لديها بنود، وكتاب ينتمي إلى فئات. عندها يكفّ الـ ORM عن فعل ما نتوقعه، لأن Java وSQL لا تعبّران عن الشيء نفسه.

في Java، يكون الارتباط ثنائي الاتجاه بطبيعته: إذا كانت commande.getLignes() تحتوي على بند، فمن الطبيعي أن تُرجع ligne.getCommande() تلك الطلبية. أما في SQL فلا يوجد سوى شيء واحد: عمود مفتاح أجنبي، في جدول واحد، من طرف واحد. ثنائية الاتجاه في Java وهمٌ تحافظ عليه بيدك. وحين تنسى الحفاظ عليه، تحصل على كيان يناقض طرفاه أحدهما الآخر، وسيكتب Hibernate ما يقوله الطرف المالك، لا ما تقوله شيفرتك.

تنبثق من هذا الدرس ثلاث عائلات من المشكلات، وكل واحدة منها تُصادَف في بيئة الإنتاج. الأولى هي LazyInitializationException، التي تظهر حين تُقرأ علاقة بعد إغلاق المعاملة. والثانية هي عملية REMOVE المتتالية (cascade)، التي تحذف أسطرًا أكثر مما هو متوقع لأنها تجتاز الرسم البياني للكيانات بأكمله. والثالثة هي @OneToMany أحادي الاتجاه، الذي ينشئ جدول ربط لم يطلبه أحد ويجعل كل عملية حذف تربيعية الكلفة.

وفوق ذلك كله، خيطنا الناظم: هنا بالذات تولد استعلامات N+1، انطلاقًا من تعليقات توضيحية (annotations) مشروعة تمامًا.

التعليقات

التعليقات مدعومة عبر GitHub Discussions

سجّل الدخول باستخدام GitHub للمشاركة في النقاش

تم نسخ الرابط!