Skip to content

2. : دراسة حالة

2.1. المشكلة

لنعد إلى التطبيق الذي نريد إنشاؤه. سنبدأ بتطبيق موجود بالفعل يتبنى البنية التالية:

لمن يرغب في معرفة المزيد عن:

  • NHibernate: مقدمة إلى NHibernate ORM [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.

دراسة الحالة هي كما يلي. نريد أن نقدم للأطباء خدمة حجز المواعيد التي تعمل وفقًا للمبدأ التالي:

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

وتتمثل بنية خدمة تحديد المواعيد فيما يلي:

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

تبدو الصفحة الرئيسية للتطبيق كما يلي:

Image

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

2.2. قاعدة البيانات

قاعدة البيانات التي يستخدمها تطبيق NHibernate هي قاعدة بيانات MySQL5 تحتوي على أربعة جداول:

Image

سنستخدم هذا كمرجع لإنشاء جميع قواعد البيانات الخاصة بنا.

2.2.1. جدول [DOCTORS]

يحتوي على معلومات حول الأطباء الذين يديرهم تطبيق [RdvMedecins].

  • ID: رقم تعريف الطبيب — المفتاح الأساسي للجدول
  • VERSION: رقم يحدد إصدار الصف في الجدول. يزداد هذا الرقم بمقدار 1 في كل مرة يتم فيها إجراء تغيير على الصف.
  • LAST_NAME: لقب الطبيب
  • FIRST_NAME: الاسم الأول للطبيب
  • TITLE: لقبهم (السيدة، السيدة، السيد)

2.2.2. جدول [CLIENTS]

يتم تخزين عملاء الأطباء المختلفين في جدول [CLIENTS]:

  • ID: رقم تعريف العميل — المفتاح الأساسي للجدول
  • VERSION: الرقم الذي يحدد إصدار الصف في الجدول. يزداد هذا الرقم بمقدار 1 في كل مرة يتم فيها إجراء تغيير على الصف.
  • LAST_NAME: اسم عائلة العميل
  • الاسم الأول: الاسم الأول للعميل
  • اللقب: لقبهم (السيدة، السيدة، السيد)

2.2.3. جدول [SLOTS]

يسرد المواعيد المتاحة:

 
  • ID: رقم تعريف الفترة الزمنية - المفتاح الأساسي للجدول
  • VERSION: الرقم الذي يحدد إصدار الصف في الجدول. يزداد هذا الرقم بمقدار 1 في كل مرة يتم فيها إجراء تغيير على الصف.
  • DOCTOR_ID: رقم التعريف الذي يحدد الطبيب الذي تنتمي إليه هذه الفترة الزمنية – مفتاح خارجي في عمود DOCTORS(ID).
  • START_TIME: وقت بدء الفترة الزمنية
  • MSTART: دقيقة بدء الفترة الزمنية
  • HFIN: وقت انتهاء الفترة الزمنية
  • MFIN: دقائق نهاية الفترة الزمنية

يشير الصف الثاني من جدول [SLOTS] (انظر [1] أعلاه)، على سبيل المثال، إلى أن الفترة رقم 2 تبدأ في الساعة 8:20 صباحًا وتنتهي في الساعة 8:40 صباحًا، وهي مخصصة للطبيبة رقم 1 (السيدة ماري بيليسييه).

2.2.4. جدول [RV]

يُدرج المواعيد المحجوزة لكل طبيب:

  • ID: معرف فريد للموعد – المفتاح الأساسي
  • DAY: يوم الموعد
  • SLOT_ID: فترة الموعد – مفتاح خارجي في عمود [ID] بجدول [SLOTS] – يحدد كل من فترة الموعد والطبيب المعني.
  • CLIENT_ID: معرف العميل الذي تم الحجز لصالحه – مفتاح خارجي في عمود [ID] بجدول [CLIENTS]

يحتوي هذا الجدول على قيد تفرد على قيم الأعمدة المرتبطة (DAY، SLOT_ID):

ALTER TABLE RV ADD CONSTRAINT UNQ1_RV UNIQUE (JOUR, ID_CRENEAU);

إذا كان أحد الصفوف في الجدول [RV] يحتوي على القيمة (DAY1، SLOT_ID1) للأعمدة (DAY، SLOT_ID)، فلا يمكن أن تظهر هذه القيمة في أي مكان آخر. وإلا، فهذا يعني أنه تم حجز موعدين في نفس الوقت لنفس الطبيب. من منظور برمجة Java، يقوم برنامج تشغيل JDBC الخاص بقاعدة البيانات بإصدار استثناء SQLException عند حدوث ذلك.

الصف الذي يحمل الرقم التعريفي 7 (انظر [1] أعلاه) يعني أنه تم حجز موعد للفترة رقم 10 والعميل رقم 2 في 09/10/2006. يوضح لنا جدول [SLOTS] أن الفترة رقم 10 تتوافق مع الفترة الزمنية من 11:00 صباحًا إلى 11:20 صباحًا وتخص الطبيبة رقم 1 (السيدة ماري بيليسييه). يخبرنا الجدول [CLIENTS] أن العميل رقم 2 هو السيدة كريستين جيرمان.

كانت هذه الدراسة الحالة موضوع مقال عن Java [http://tahe.developpez.com/java/primefaces] تم فيه استخدام Hibernate ORM لـ Java.