هذه المرة دعونا نتحدث عن التصميم الهرمي لإسبات ، وهو تصميم علاقة الميراث بين الكيانات.
ربما يكون هذا أكثر تجريدًا ، دعنا نلقي نظرة على الأمثلة مباشرة.
1) دعونا نلقي نظرة أولاً على الممارسة الشائعة وندخل الكود بشكل مباشر: الفصول الثلاثة الحقيقية هي كما يلي:
Titem الطبقة العامة تنفذ مسلسل {// حذف Get/Set Method private int id ؛ تصنيع السلسلة الخاصة ؛ اسم السلسلة الخاصة ؛ } tbook الفئة العامة يمتد titem {// shf get/set method private int pagecount ؛ } الفئة العامة TDVD يمتد Titem {// shemit get/set method private string regioncode ؛ }
هنا نحتاج إلى ثلاثة ملفات رسم خرائط ، والمحتويات هي كما يلي:
<class name = "titem" table = "item"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </id> <property name = "name" column = "name" type = table = "book"> <id name = "id" column = "id" type = "java.lang.integer"> </id> </id> <property name = "name" column = "name" type = "java.lang.String"/> <property name = "manufacture" column = "type =" java.lang. type = "java.lang.integer"/> </slass> <class name = "tdvd" table = "dvd"> <id name = "id" column = "id" type = "java.lang.integer"> </id> <id> <property name "colum" colum = "type" = "java.lang type = "java.lang.string"/> <property name = "regionCode" column = "regionCode" type = "java.lang.string"/> </slass>
ملفات رسم الخرائط العادية للغاية ، لا فرق عن الملامح السابقة.
لنكتب طريقة اختبار مباشرة:
public void testselect () {query query = session.createquery ("from titem") ؛ قائمة قائمة = Query.List () ؛ iterator iter = list.iterator () ؛ بينما (iter.hasnext ()) {system.out.println ("name:"+(((Titem) iter.next ()). getName ())) ؛}} لاحظ أننا هنا نستخدم فئة Titem ، وليس فئة Word المحددة. هنا سوف يبحث تلقائيًا عن فئات فرعية موروثة من فئة Titem وتجد جميع النتائج. وهذا ينطوي على تعدد الأشكال. تحتوي علامة الفصل على تعدد الأشكال ، وقيمتها الافتراضية ضمنية ، مما يعني أنه يمكن الاستعلام عن النتيجة دون تحديد اسم. إذا كان الأمر واضحًا ، فهذا يعني أنك تحتاج إلى تحديد اسم فئة محدد قبل أن تتمكن من العثور على نتيجة هذا النوع.
2) في المثال السابق ، استخدمنا ثلاثة ملفات رسم الخرائط. عندما نحتاج إلى تعديل ، نحتاج إلى تعديل ثلاثة ملفات رسم خرائط ، وهو أمر غير ممكن للمشاريع الكبيرة. علاوة على ذلك ، كل جدول له حقول مقابلة للفئة الرئيسية المقابلة ، والتي تكون زائدة عن الحاجة. لذلك لدينا الطريقة التالية.
فئة الكيان لا تزال هي نفسها كما في 1). نقوم بتغيير ملف التعيين من ثلاثة إلى واحد ، ونحتفظ فقط بملف تعيين Titem. لكننا نحتاج إلى إجراء تعديلات مماثلة ، والمحتوى الآن كما يلي:
<class name = "titem" table = "item" polymorphism = "explicit"> <id name = "id" column = "id" type = "java.lang.integer"> <generator/> </id> <property name = "name" column = "type" = "java.lang.string"/> <joined-subclass name = "tbook" table = "tbook"> <key column = "id" /> <property name = "pagecount" column = "pagecount" type = "java.lang.integer" /> < /joined-subclass> <joined-subclass name = "tdvd" column = "regioncode" type = "java.lang.string"/> </joined-subclass> </class>
هنا ، ليس لدينا سوى ملف رسم الخرائط ، ولكن هناك علامة ضمنية مرتبطة ، والتي تشير إلى أن هذه الفئة ترث من الفئة الحالية ، <key> تشير إلى المفتاح الأساسي للطاقة الفرعية. هنا ، يشير الجدول الفرعي إلى الجدولين المقابلان للفئات الفرعية ، Tbook و TDVD. يتم تحديد الحقول فقط في الخضوع في الممتلكات.
وبهذه الطريقة ، فإن الجدول الذي تم إنشاؤه بعد الركض هو كما يلي:
الجدول المقابل للفئات الفرعية هو فقط الحقول التي نحددها من خلال الخاصية. هذا يتجنب حقول متعددة في الجدول ، بحيث يحافظ جدول الكلمة فقط على حقوله المنفصلة. عندما تتغير فئة العنصر ، ليست هناك حاجة إلى إجراء الكثير من التعديلات.
3) دعنا نتعرف على طريقة أخرى لتنفيذ التصميم الهرمي ، والذي يتم تحقيقه عن طريق وضع الأعلام في الطاولة. في ملف تعيين السبات ، نقوم بتنفيذه من خلال علامة descriminator.
بدون مزيد من اللغط ، دعونا نلقي نظرة على المثال:
قمنا بتعديل ملف رسم الخرائط لتيرة الأمس إلى:
<class name = "titem" table = "item" polymorphism = "explicit"> <id name = "id" column = "id" type = "java.lang.Integer"> <generator/> </id> <idgyinator column = "category" type = "java.lang.string"/> name = "تصنيع" عمود = "تصنيع" type = "java.lang.String"/> </slass>
عند رؤية الوسط ، أضفنا علامة تمييز ، والتي تُظهر الحقل الذي يتميز به اثنين من الفئات الفرعية.
<اسم الفئة الفرعية = "tbook" mariminator-value = "1"> <property name = "pagecount" column = "pageCount"/> </fricleass> <str charass name = "tdvd" subciminator-value = "2"
نرى هاتين الفقرتين ، والتي تشير إلى أنه عندما تكون قيمة الحقل المحدد من قبل التمييز هي 1 ، فإنه يشير إلى أنه فئة Tbook وأن PageCount لها قيمة ؛ عندما تكون قيمة الحقل المحدد من قبل التمييز 2 ، فإنه يشير إلى أنه فئة TDVD ولديها رمز المنطقة.
وبهذه الطريقة ، نحتاج فقط إلى استخدام جدول واحد ، مما يشير إلى العلاقة بينهما وبين عدة فئات. لاحظ أن هذه الطريقة ليست جيدة للعديد من الفئات الفرعية. سوف يسبب الكثير من الحقول في الجدول الرئيسي ويسبب بعض إزعاج التصميم.