1. رسم خرائط الميراث
الميراث هو ميزة مهمة موجهة نحو الكائن. وهو ينفذ استخدام الكود وله أيضًا علاقة ميراث في نموذج العلاقة. يمكن اعتبار هذه العلاقة الميراث في الواقع علاقة تعداد. يمكن تعداد العديد من الأنواع الفرعية في النوع. تشكل هذه الأنواع الفرعية علاقة ميراث مع الكائن الأصل. يمكن اعتبار معظم التعدادات التي يمكن تعدادها بمثابة خريطة ميراث. لذلك ، يمكن اعتبار علاقة التعداد هذه بمثابة خريطة ميراث. على سبيل المثال ، الحيوانات هي فئة مجردة ، وهي الفئة الأم للحيوانات الأخرى ، والخنازير ، والقطط ، وما إلى ذلك ، وهي علاقة ميراث ، كما هو موضح في الشكل أدناه:
سيؤدي رسم خرائط الميراث هذا إلى إنشاء جدول بعد تحويله إلى نموذج علائقي. فكيف يميز هذا الجدول بين هذين النوعين؟ استخدم الحقول العلائقية ، تحتاج إلى إضافة حقول النوع إلى الجدول واستخدام الكلمات الرئيسية للإشارة إلى نوع الكائن. لذلك ، فإن بنية الجدول المقابلة لنموذج الكائن في الشكل أعلاه هي كما يلي:
عند إنشاء بنية الجدول ، تحتاج إلى إضافة نوع الحقل المقابل ، لذلك تحتاج إلى إضافة تمييز الخريطة المقابل إلى ملف التعيين. هنا تحتاج إلى استخدام سمة قيمة التمييز.
1. ملفات الفصل
ليست هناك حاجة إلى الانتباه إلى ملفات الفصل ، فقط انتبه إلى علاقة الميراث بينهما عند الكتابة.
القائمة: رمز فئة الحيوانات ، تحتاج فقط إلى إضافة خصائص أساسية.
حزمة com.src.hibernate ؛ الطبقة العامة Animal {// id number private int id ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } // اسم اسم السلسلة الخاصة ؛ السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } // الجنس الخاص بالجنس المنطقي ؛ منطقية عامة ISSEX () {return sex ؛ } public void setSex (boolean sex) {this.sex = sex ؛ }}القائمة 2: فصول الطيور والخنازير ، إضافة الخصائص الأساسية ، وفئات الحيوانات الوراثية.
حزمة com.src.hibernate ؛ طير الطبقة العامة يمتد الحيوان {// الارتفاع بالرقم الخاص ؛ العام int getheight () {عودة الارتفاع ؛ } public void setheight (int height) {this.height = height ؛ }} package com.src.hibernate ؛ يمتد خنزير الطبقة العامة الحيوان {// الوزن الخاص بالوزن الداخلي ؛ public int getweight () {return weight ؛ } public void setweight (int weight) {this.weight = weight ؛ }} 2. ملفات الخريطة
يجب إضافة التعيين المقابل إلى ملف التعيين. يجب إضافة ملف تعيين واحد فقط إلى النموذج ، لأنه يتم إنشاء جدول واحد فقط ، يتم إضافة تعيين الفئة الفرعية المقابلة إلى ملف التعيين. استخدم علامة <frics> ، ويتم إضافة قيمة التمييز إلى العلامة. تشير خاصية التمييز هذه إلى النوع المكتوب عند كتابة البيانات في قاعدة البيانات ، على النحو التالي:
<؟ table = "t_animal"> <id name = "id"> <generator // id> <!-أضف علامة مصادقة ويجب وضعها بعد المعرف-> <mariminator colun name = "Weight"/> </fricleass> <name charass = "com.src.hibernate.bird" mariminator-value = "b"
3. نتائج التحليل
لن يضيف جدول قاعدة بيانات MySQL الذي تم إنشاؤه فقط السمات الأساسية للحيوان ، ولكن أيضًا إضافة خصائص الخنزير والطيور. نظرًا لأن السمات المضافة مكتوبة باستخدام <فئة فرعية> في ملف التعيين ، وتتم إضافة سمات التمييز المقابلة أيضًا ، لذلك ستتم إضافة أعمدة التمييز المقابلة إلى قاعدة البيانات. هيكل الجدول المولد كما يلي:
2. تشغيل البيانات
1. كتابة البيانات
عند إجراء عمليات قراءة البيانات وكتابةها ، تحتاج إلى الانتباه إلى استخدام العمليات في الفصل.
public void testSave () {جلسة الجلسة = null ؛ حاول {// إنشاء جلسة كائن جلسة = hibernateutils.getSession () ؛ // Open Transaction Session.BeginTransaction () ؛ خنزير خنزير = خنزير جديد () ؛ pig.setName ("خنزير صغير") ؛ pig.setsex (صواب) ؛ Pig.Setweight (200) ؛ Session.save (Pig) ؛ الطيور الطيور = طائر جديد () ؛ Bird.setName ("Xiaoniao") ؛ bird.setsex (صواب) ؛ Bird.Setheight (100) ؛ Session.save (Bird) ؛ session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}2. استعلام متعدد الأشكال و HQL
تتطلب طريقة الاستعلام الأساسية فقط استخدام الحمل والحصول على الطرق. نحن هنا نركز على الاستعلام متعدد الأشكال. يعني الاستعلام متعدد الأشكال أنه يمكن لـ Hibernate استخدام مثيل لتحديد نوع الكائن الحقيقي عند تحميل كائن ، بحيث يمكن أن يكون استعلامًا متعدد الأشكال.
ملاحظة: لا تدعم الاستعلامات المتعددة الأشكال التحميل الكسول ، أي إذا كنت تستخدم طريقة التحميل ، فأنت بحاجة إلى ضبط التحميل البطيء على خطأ في ملف التعيين.
3. تحميل تحميل تأخير
التحميل يدعم التحميل كسول. عند تحميل الكائنات ، فإنه يولد بالفعل وكيل الكائن. لذلك ، عند استخدام استعلامات الأشكال ، تحتاج إلى ضبط التحميل كسول على خطأ في ملف التعيين ، على النحو التالي:
<؟ table = "t_animal" lazy = "false"> <id name = "id"> <generator // id> <!-أضف علامة مصادقة ويجب وضعها بعد المعرف-> <mariminator column = "type"/> <property name = "name"/> <property name = "sex" type = التمييز-value = "p"> <property name = "weight"/> </scleass> <charass name = "com.src.hibernate.bird" mariminator-value = "b"> <property name = "High
طريقة التحميل ، باستخدام التحميل للتحميل ، يدعم هذا المثال الاستعلامات الأشكال المتعددة ، وتعيين التحميل المتأخر على خطأ في ملف التكوين ، بحيث يمكن استخدام طريقة التحميل هنا للتحميل والحصول على فئة الكائن المقابلة.
public void testload () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ ani ani = (Animal) Session.load (Animal.class ، 1) ؛ System.out.println (ani.getName ()) ؛ // نظرًا لأن الحمل يدعم كسول افتراضيًا ، فإننا نرى وكيل Animal // so extomof لا يمكنه تحديد النوع الحقيقي pig // لذلك لا يدعم التحميل الاستعلام متعدد الأشكال في هذه الحالة إذا (ani extryof pig) {system.out.println ("أنا خنزير!") ؛ } آخر {system.out.println ("أنا لست خنزير!") ؛ } session.getTransaction (). commice () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} 4.HQL استعلام
يدعم HQL استعلامات الأشكال المتعددة ، وهذا يرجع أساسًا إلى أن الاستعلام هو كائن حقيقي ولا يعيد وكيلًا. لذلك ، يدعم HQL الاستعلامات المتعددة الأشكال. بالإضافة إلى ذلك ، عند الاستعلام ، تحتاج إلى الانتباه لعدم استخدام أسماء الجدول في عبارة الاستعلام ، ولكن باستخدام أسماء الفصول. ستقوم السباتية بتخطيط اسم الجدول المقابل وفقًا لاسم الفصل ، على النحو التالي:
public void testload5 () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ قائمة <antant> list = session.createquery ("من Animal"). list () ؛ لـ (iterator iter = list.iterator () ؛ iter.hasnext () ؛) {Animal a = (Animal) iter.next () ؛ if (A extryof pig) {system.out.println ("أنا خنزير!") ؛ } آخر {system.out.println ("أنا لست خنزيرًا!") ؛ }} session.getTransaction (). commice () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}نتائج الاستعلام:
Hibernate: حدد Animal0_.id as id0_ ، Animal0_.name as name0_ ، Animal0_.Sex As Sex0_ ، Animal0_.weight as weight0_ ، animal0_.height as hight0_ ، Animal0_.type as type0_ from t_animal animal0_ i am piglet! أنا لست خنزير! أنا خنزير! أنا لست خنزير!
3. ثلاث استراتيجيات لرسم خرائط الميراث
1. جدول كل فئة هرمية
لنفترض أن لدينا دفع واجهة وفئات التنفيذ العديدة: CreditCardPayment ، CashPayment ، و ChequePayment. ثم رمز تعيين "الجدول لكل فئة هرمية" هو كما يلي:
<class name = "payment" table = "payment"> <id name = "id" type = "long" column = "payment_id"> </> </id> <mariminator column = "payment_type" type = "string"/> <property name = "mate" complean "/> ... column = "cctype"/> ... </charass> <name charass الفرعي = "cashpayment" mariminator-value = "cash" ... </subcleass> <strics charass = "chaupayment" adminator-value = "check"> ... </class> </class
هناك حاجة إلى جدول واحد فقط لتبني هذه الاستراتيجية. إنه له قيود كبيرة: يتطلب أن لا يمكن أن يكون لها الحقول التي تحددها الفئات الفرعية ، مثل CCTYPE ، قيودًا غير فائقة.
2. جدول واحد لكل فئة فرعية
بالنسبة للفئات الموجودة في المثال أعلاه ، يتم اعتماد استراتيجية تعيين "جدول واحد لكل فئة فرعية" ، والرمز كما يلي:
<class name = "payment" table = "payment"> <id name = "id" type = "long" column = "payment_id"> </> </id> <property name = "comme column =" come "/> ... name = "cashpayment" table = "cash_payment"> <key column = "payment_id"/> <property name = "creditCardType" column = "cctype"/> ... </joined-subclass> <joined-subclass name = "chequepayment"
أربعة طاولات مطلوبة. ترتبط جداول الفئات الفرعية الثلاثة بجدول الفئة الفائقة من خلال المفاتيح الأولية (وبالتالي فإن نموذج العلاقة هو في الواقع جمعية واحدة إلى واحد).
3. كل فئة فرعية لها جدول (جدول لكل فئة فرعية) ، واستخدم التمييز
لاحظ أنه بالنسبة لاستراتيجية تعيين "جدول واحد لكل فئة فرعية" ، لا يتطلب تنفيذ السبات الحقول التمييز ، في حين تستخدم أدوات الخرائط الكائن/العلائقية الأخرى طريقة تنفيذ مختلفة عن السبات ، الأمر الذي يتطلب عمود تمييز من النوع في جدول الفئة الفائقة. من الصعب تنفيذ الطريقة التي تبنتها السبات ، ولكن من منظور العلاقات (قواعد البيانات) ، فهي أكثر صحة. إذا كنت على استعداد لاستخدام استراتيجية "جدول واحد لكل فئة فرعية" مع حقول التمييز ، فيمكنك استخدام <فئة فرعية> مع <join> على النحو التالي:
<class name = "payment" table = "payment"> <id name = "id" type = "long" column = "payment_id"> </> </id> <mariminator column = "payment_type" type = "string"/> <property name = "mate" <property name = "creditCardType" column = "cctype"/> ... </join> </scleass> <charass name = "cashpayment" mariminator-value = "cash"> <join table = "cash_payment"> ... </join> </subcleass> <class name = "chequpayment" table = "cheque_payment" fetch = "select"> ... </join> </sclass> </slass> </slass>
يتم استخدام الإعلان الاختياري الذي يجلبه = "SELECT" لإخبار السبات بأنه عند الاستعلام عن فئات فائقة ، لا تستخدم صلة خارجية للاستيلاء على بيانات المداخن الفرعي.