2. : دراسة حالة
2.1. المشكلة
لنعد إلى التطبيق الذي نريد إنشاءه. نبدأ من تطبيق موجود بالفعل له البنية التالية:
![]() |
لمن يرغب في معرفة المزيد عن:
- NHibernate: مقدمة إلى ORM Nhibernate [http://tahe.developpez.com/dotnet/nhibernate/]؛
- تطبيق ASP.NET (WebForms) مع NHibernate و Spring : بناء تطبيق ويب ثلاثي الطبقات باستخدام ASP.NET و Spring.NET و NHibernate [http://tahe.developpez.com/dotnet/pam-aspnet/].
نريد تحويل التطبيق السابق إلى هذا:
![]() |
حيث استبدل EF5 بـ NHibernate. هذا التطبيق هو ذريعة لدراسة EF5. نظرًا لأن Spring.NET يسمح لنا بسهولة بتغيير الطبقة دون إتلاف أي شيء، فإن التطبيق 2 سيستخدم نفس الطبقة [ASP.NET] التي يستخدمها التطبيق 1. نظرًا لأن هذا المستند مخصص لـ EF5، فلن نشرح كتابة هذه الطبقة. سنقوم بإدخالها في التطبيق 2 للتأكد من أنها تعمل. سنشرح ببساطة التغييرات التي يجب إجراؤها في ملف تكوين Spring.NET.
دراسة الحالة هي كما يلي. نرغب في تقديم خدمة حجز المواعيد للأطباء تعمل وفقًا للمبدأ التالي:
- تقوم خدمة سكرتارية بحجز المواعيد لعدد كبير من الأطباء. يمكن أن تقتصر هذه الخدمة على شخص واحد. ويتم تقاسم راتبه بين جميع الأطباء الذين يستخدمون خدمة حجز المواعيد؛
- تكون خدمة السكرتارية وجميع الأطباء متصلين بالإنترنت؛
- يتم تسجيل المواعيد في قاعدة بيانات مركزية، يمكن الوصول إليها عبر الإنترنت، من قبل السكرتارية والأطباء؛
- عادةً ما يتم حجز RV من قبل السكرتارية. ويمكن أيضًا أن يقوم الأطباء أنفسهم بذلك. وهذا هو الحال على وجه الخصوص عندما يحدد الطبيب بنفسه موعدًا جديدًا لمرضاه في نهاية الاستشارة.
هيكل خدمة تسجيل RV هو كما يلي:
![]() |
يزداد كفاءة الأطباء إذا لم يعودوا مضطرين إلى التعامل مع RV. وإذا كان عددهم كافياً، فستكون مساهمتهم في تكاليف تشغيل السكرتارية ضئيلة. سنطلق على التطبيق اسم [RdvMedecins]. ونقدم أدناه لقطات شاشة توضح كيفية عمله.
صفحة التطبيق الرئيسية هي كما يلي:

من هذه الصفحة الأولى، سيقوم المستخدم (الأمانة، الطبيب) بعدد من الإجراءات. نعرضها أدناه. تعرض الصورة اليسرى الشاشة التي يقوم المستخدم من خلالها بتقديم طلب، بينما تعرض الصورة اليمنى الرد المرسل من الخادم.
![]() |
![]() |
![]() |
![]() |
![]() |
2.2. قاعدة البيانات
قاعدة البيانات المستخدمة من قبل التطبيق NHibernate هي قاعدة بيانات MySQL5 تحتوي على أربعة جداول:

وستكون بمثابة مرجع لنا لبناء جميع قواعد البيانات الخاصة بنا.
2.2.1. الجدول [MEDECINS]
تحتوي على معلومات عن الأطباء الذين يديرهم التطبيق [RdvMedecins].
![]() | ![]() |
- ID: رقم تعريف الطبيب - المفتاح الأساسي للجدول
- VERSION: رقم تعريف إصدار السطر في الجدول. يتم زيادة هذا الرقم بمقدار 1 في كل مرة يتم فيها إجراء تعديل على السطر.
- NOM: اسم الطبيب
- PRENOM: اسمه الأول
- TITRE: لقبه (الآنسة، السيدة، السيد)
2.2.2. الجدول [CLIENTS]
يتم تسجيل عملاء الأطباء المختلفين في الجدول [CLIENTS]:
![]() | ![]() |
- ID: رقم تعريف العميل - المفتاح الأساسي للجدول
- VERSION: رقم تعريف إصدار السطر في الجدول. يتم زيادة هذا الرقم بمقدار 1 في كل مرة يتم فيها إجراء تعديل على السطر.
- NOM: اسم العميل
- PRENOM: اسمه الأول
- TITRE: لقبه (آنسة، سيدة، سيد)
2.2.3. الجدول [CRENEAUX]
تسرد هذه الجدول الفترات الزمنية التي يمكن فيها استخدام RV:
![]() |
![]() |
- ID: الرقم الذي يحدد الفترة الزمنية - المفتاح الأساسي للجدول
- VERSION: الرقم الذي يحدد إصدار السطر في الجدول. يتم زيادة هذا الرقم بمقدار 1 في كل مرة يتم فيها إجراء تعديل على السطر.
- ID_MEDECIN: رقم تعريف الطبيب الذي ينتمي إليه هذا الموعد – مفتاح خارجي في العمود MEDECINS(ID).
- HDEBUT: وقت بدء الفترة الزمنية
- MDEBUT: دقائق بداية الفترة
- HFIN: ساعة انتهاء الفترة الزمنية
- MFIN: دقائق نهاية الفترة الزمنية
تشير السطر الثاني من الجدول [CRENEAUX] (انظر [1] أعلاه) ، على سبيل المثال ، إلى أن الفترة رقم 2 تبدأ في الساعة 8:20 وتنتهي في الساعة 8:40 وتخص الطبيب رقم 1 (السيدة ماري PELISSIER).
2.2.4. الجدول [RV]
تسرد الجدول RV المواعيد المحددة لكل طبيب:
![]() |
- ID: رقم يحدد RV بشكل فريد – مفتاح أساسي
- JOUR: يوم RV
- ID_CRENEAU: الفترة الزمنية لـ RV - مفتاح خارجي في العمود [ID] من الجدول [CRENEAUX] – يحدد في آن واحد الفترة الزمنية والطبيب المعني.
- ID_CLIENT: رقم العميل الذي تم الحجز لصالحه – مفتاح خارجي في العمود [ID] من الجدول [CLIENTS]
يحتوي هذا الجدول على قاعدة بيانات ( ) تفرض التفرّد على قيم الأعمدة المرتبطة (JOUR، ID_CRENEAU):
إذا كان أحد صفوف الجدول [RV] يحتوي على القيمة (JOUR1، ID_CRENEAU1) للأعمدة (JOUR، ID_CRENEAU)، فلا يمكن أن توجد هذه القيمة في أي مكان آخر. وإلا، فهذا يعني أنه تم أخذ RV مرتين في نفس الوقت لنفس الطبيب. من منظور برمجة Java، يقوم برنامج التشغيل JDBC للقاعدة بإطلاق SQLException عند حدوث هذه الحالة.
السطر id الذي يساوي 7 (انظر [1] أعلاه) يعني أنه تم حجز RV للفترة رقم 10 والعميل رقم 2 في 10/09/2006. يخبرنا الجدول [CRENEAUX] أن الموعد رقم 10 يتوافق مع الفترة الزمنية من 11:00 إلى 11:20 وينتمي إلى الطبيب رقم 1 (السيدة ماري PELISSIER). تخبرنا الجدول [CLIENTS] أن العميل رقم 2 هو السيدة كريستين GERMAN.
كانت هذه الدراسة الحالة موضوع مقال Java [http://tahe.developpez.com/java/primefaces] الذي يستخدم فيه Hibernate لـ Java.














