1. رسم خرائط لجمعية أحادية الاتجاه
غالبًا ما ينظر إلى نموذج كائن العلاقة الواحدة في الحياة اليومية. خذ الطلاب والفصول كمثال. هناك العديد من الطلاب في فصل ما ، وبالتالي فإن العلاقة بين الفصل والطلاب هي علاقة واحدة إلى أقراص ، تم تعيينها في نموذج الكائن ، كما هو موضح في الشكل أدناه:
يوضح نموذج الكائن أن هذه العلاقة الواحدة إلى حد ما يتم الحفاظ عليها من خلال نهاية واحدة ، وبالتالي فإن تعيين نموذج العلاقة يعني أنه سيكون هناك العديد من الطلاب في حقل الفصل ، والذي يشكل علاقة واحدة إلى حد. يمكن الحصول على معلومات الطالب من خلال الفصل. نموذج العلاقة المقابل على النحو التالي:
1. التكوين الأساسي
باستخدام نموذج الكائن ، ثم قم بتخطيطها في رمز العلاقة المقابل. عند إجراء رسم خرائط للعلاقات ، تحتاج إلى إضافة علامة <-One-Undyy> في نهاية واحدة. بالإضافة إلى ذلك ، تحتاج إلى إضافة سمة SET في نهاية واحدة. وهو يدعم التحميل البطيء ، ثم إضافة علامة تعيين في ملف التعيين وحدد علاقة واحدة إلى أقصى ، بحيث يمكنك الاستعلام والحصول على نهاية متعددة على نهاية واحدة.
الفصول وملفات التعيين:
إنها أهم نهاية للنموذج. في هذه النهاية ، تحتاج إلى إضافة سمة SET المقابلة وإضافة علامة تعيين في ملف التكوين. يمكنك تكوين كائن <-One-Under> المقابل في علامة SET. رمز كائن java classes.java كما يلي:
حزمة com.src.hibernate ؛ استيراد java.util.set ؛ فئات الطبقة العامة {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 ؛ } اسم السلسلة الخاصة ؛ // مجموعة تدعم التحميل البطيء للطلاب الخاصين ؛ مجموعة عامة getStudents () {return students ؛ } setStudents public void (تعيين الطلاب) {this.students = students ؛ }}يتم استخدام سمة SET في كائن الفئات ، ولكنها تشرح فقط سمات التحميل المتأخرة ولا تقوم بتكوين الكائن المقابل للسمة. يجب تكوين كائن السمة في ملف التعيين. تحتاج إلى إضافة علامة تعيين وإضافة علامة <-One-to-Many> إلى علامة SET. الرمز المحدد كما يلي:
<؟ table = "t_classes"> <id name = "id"> <generator // id> <property name = "name"/> <set name = "students"> <key column = "classeD"> </key> <-to-many> </son-to-many> </stist
لا تتطلب الكود والملفات في كائن الطالب المقابل أي تكوين خاص ، بل يجب كتابتها فقط وفقًا لطريقة الكتابة المعتادة. لن يتم وصف طريقة التكوين المحددة بالتفصيل ، فهي بسيطة للغاية. بعد التكوين ، تحتاج إلى إنشاء عبارة SQL المقابلة. عند تحويل نموذج الكائن إلى نموذج علائقي ، يقوم Hibernate بإنشاء العبارة المقابلة على النحو التالي:
تغيير جدول T_STUDENT DROP المفتاح الأجنبي FK4B9075705E0AFEFE TABLE إذا كان موجودًا T_CLASSES DROP TABLE إذا كان موجودًا T_STUDENT إنشاء جدول T_CLASSES (ID INTEGER NOT NULL AUTO_INCREMEN عدد صحيح ، المفتاح الأساسي (معرف)) تغيير الجدول T_Student إضافة فهرس FK4B9075705E0AFEFE (classesid) ، إضافة القيد FK4B9075705E0AFEFE المفتاح الخارجية (CLASSED) T_CLASSES (ID)
يظهر نموذج العلاقة المقابل الذي تم إنشاؤه أدناه:
بمقارنة عبارات SQL ونماذج العلاقة ، يتم الحفاظ على الارتباط بين الجداول المقابلة من خلال المفاتيح الخارجية. أولاً ، قم بإنشاء جدولين ، وحدد المفتاح الأساسي للجدول ، وأخيراً إضافة علاقة جمعية مفتاح خارجي واحد.
2. العمليات الأساسية
العمليات الموجودة في قاعدة البيانات ليست أكثر من القراءة والكتابة ، والتعديل هو أيضًا نوع من الكتابة. بعد ذلك ، دعونا نرى كيفية كتابة وقراءة العمليات في قاعدة البيانات.
(1) كتابة البيانات:
عند كتابة البيانات ، تحتاج إلى الانتباه إلى العلاقة الواحدة ، لذلك تحتاج إلى إضافة فصول متعددة للطلاب عند إضافتها. بالإضافة إلى ذلك ، نظرًا لأن سمة المجموعة المقابلة يتم إضافة إلى الفصول ، يجب عليك استخدام Hashset لإضافة عند إضافة كائنات الطلاب ، حتى تتمكن من إدراك علاقة واحدة. الرمز المحدد كما يلي:
public void testSave2 () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ الطالب 1 = طالب جديد () ؛ student1.setName ("Zhangsan") ؛ Session.save (student1) ؛ الطالب 2 = طالب جديد () ؛ student2.setName ("Lisi") ؛ Session.save (student2) ؛ فصول الفصول = فئات جديدة () ؛ classes.setName ("classone") ؛ تعيين الطلاب = new hashset () ؛ student.add (student1) ؛ student.add (student2) ؛ الفصول الدراسية. // يمكن حفظ البيانات بنجاح // ولكن سيتم إصدار بيان تحديث إضافي للحفاظ على العلاقة لأنها جلسة عقل واحد. session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} ثم ، بعد كتابة البيانات المقابلة التي تم إنشاؤها عن طريق تشغيل حالة الاختبار أعلاه إلى قاعدة البيانات ، يكون الشكل التالي كما يلي:
(2) قراءة البيانات:
عملية الكتابة بسيطة نسبيا. تحتاج فقط إلى إضافة جميع الكائنات المحملة إلى الحالة العابرة وتشغيل الطريقة المقابلة لإدخال المحتوى. ومع ذلك ، فإن عملية القراءة المقابلة ستكون أكثر تعقيدًا قليلاً. نظرًا لأنه من الضروري التكرار الحصول على جميع كائنات الطلاب ، فإن هذه العلاقة الفردية ليست فعالة للغاية. الرمز المحدد كما يلي:
حزمة com.test.hibernate ؛ استيراد java.util.iterator ؛ استيراد java.util.set ؛ استيراد com.src.hibernate.*؛ استيراد junit.framework.testcase ؛ استيراد org.hibernate.session ؛ الفئة العامة One2ManyTest يمتد testcase {public void testload1 () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ // الحصول على معلومات الفصل مع فئات المفتاح الأساسي 5 فئات = (الفئات) SESSE.LOAD (CLASES.CLASS ، 5) ؛ // طباعة معلومات الفئة system.out.println ("classes.name ="+classes.getName ()) ؛ // قم بتعيين مجموعة الطالب وتحميلها من خلال مجموعة الفصل الدراسي = الفصول. getStudents () ؛ . System.out.println ("student.name ="+student.getName ()) ؛ } session.getTransaction (). commice () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}}البيانات المقابلة والمعلومات التي تم إنشاؤها هي كما يلي:
hibernate: حدد classes0_.id as id1_0_ ، classes0_.name as name1_0_ from t_classes classes0_ where classes0_.id =؟ classes.name = classone hibernate: حدد students0_.classesid as classID1_ ، students0_.id as id1_ ، students0_.id as id0_0_ ، students0_.name as name0_0_ from t_student students0_ where uTuleds0_.classesid =؟ student.name = lisi student.name = Zhangsan
2. رسم خرائط لجمعية ثنائية الاتجاه
هنا نستمر في استخدام الطلاب والفصول كأمثلة. هناك علاقة فردية بين الفصل والطلاب. هناك العديد من الطلاب في الفصل. على عكس المقال السابق ، فإن العلاقة هنا هي في اتجاهين ، أي إحدى الطرفين والطرف واحد يحافظان على العلاقة في نفس الوقت ، لذلك فإن مخطط الكائن الخاص به هو كما يلي:
لا يتغير مخطط نموذج العلاقة المقابل كثيرًا ، لأن العلاقة بينهما تكون ثنائية الاتجاه ، لذلك يحافظ كلا طرفي نموذج العلاقة على علاقة العلاقة في نفس الوقت وتخطيط نموذج العلاقة كما هو موضح في الشكل أدناه:
في جمعية أحادية الاتجاه من طراز واحد ، يجب تكوين ملف التعيين فقط بشكل خاص في نهاية واحدة. استخدم التكوين <-One-Many> واستخدم Set Iterator في نموذج الكائن لتعيين نموذج الكائن المرتبط. ومع ذلك ، فإن الفرق هو أنه في جمعية ثنائية الاتجاه ، يجب إضافة جمعية المفتاح الخارجية المقابلة في الطرف الآخر في النهاية المتعددة. في هذا الوقت ، يجب استخدام علاقة <sire-to-One> في النهاية المتعددة للإشارة إلى هذا الاندماج.
1. رسم الخرائط
يتم استخدام الفصول والطالب أيضًا كأمثلة هنا. المحتوى الموجود في الفصول هو نفسه كما هو مذكور أعلاه ولن يتغير ، لكن تكوين الطلاب على الأطراف المتعددة سيتغير ، أي ، يجب إضافة العلامة <-to one> إلى ملف التعيين.
يتطلب تكوين ملف Mapping student.hbm.xml إضافة عمود مفتاح خارجي <إلى واحد> ، ويجب أن يكون اسم العمود متسقًا مع اسم عمود المفاتيح الخارجية للصفوف. hbm.xml. الرمز المحدد كما يلي:
<؟ table = "t_student"> <id name = "id"> <generator/generator/> </id> <property name = "name"/> <!-أضف عمود فئات جديدة في الطالب على جانب واحد ، ويجب أن يكون اسم العمود هو نفس قائمة الفئات.
إن تكوين ملف تعيين الفئات. hbm.xml هو نفسه كما في المقالة السابقة. تجدر الإشارة إلى أن تعيين سمة SET تتم إضافة إلى ملف classes.java ويتوافق مع كائن الطالب. لذلك ، يجب إضافة علامة SET إلى ملف التعيين للإشارة إلى أن جهاز التكرار الضخم يستخدم في نموذج الكائن. التكوين المحدد هو كما يلي:
<؟ table = "t_classes"> <id name = "id"> <generator // id> <property name = "name"/> <set name = "students" ebervers = "true"> <key column = "classesid"
2. الفصل
يتوافق تكوين ملف التعيين مباشرةً مع الفصل ، لذلك مع ملف التعيين ، يمكنك كتابة الفئة المقابلة. مع نفس الفصل ، يمكنك معرفة كيفية كتابة ملف التعيين المقابل. دعنا نلقي نظرة على كيفية كتابة رمز الفصل المقابل.
يتطلب java class إضافة سمات كائن الفئة المرتبطة بالفصل ، ويمكنك الحصول على معلومات متعلقة بالفصول عند تحميل الطالب.
حزمة com.src.hibernate ؛ طالب الطبقة العامة {// الفصول الدراسية الفئة المرتبطة بالفصول الخاصة ؛ الفئات العامة getClasses () {return classes ؛ } public void setClasses (فئات الفئات) {this.classes = classes ؛ } // معرف الطالب الخاص int id ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } // اسم الطالب اسم السلسلة الخاصة ؛ السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ }} يتم عرض محتوى الكود المحدد من Classes.java في المقالة السابقة ، ولن يتم وصفه بالتفصيل هنا.
مع نموذج الكائن ، يتم إنشاء نموذج العلاقة. بيان SQL الذي تم إنشاؤه هو كما يلي:
تغيير جدول T_STUDENT DROP المفتاح الأجنبي FK4B907570FC588BF4 جدول إسقاط إذا كان موجودًا T_CLASSES DROP TABLE إذا كان موجودًا T_STUDENT إنشاء جدول T_CLASSES (ID integer not null auto_increment ، name varchar (255) Integer ، المفتاح الأساسي (معرف)) تغيير الجدول T_STUDENT إضافة فهرس FK4B907570FC588BF4 (classesid) ، إضافة القيد FK4B907570FC588BF4 المفتاح الأجنبي (classesid) المراجع T_Classes (ID)
3. تشغيل البيانات
بعد إنشاء بنية جدول ، كتبت طريقة اختبار للتحقق من تشغيل البيانات. أولاً ، دعنا نلقي نظرة على إدخال البيانات وإدراج البيانات في بنية الجدول. هناك حالتان عند كتابة البيانات. أحدهما هو أولاً إنشاء كائن فئات ، وكتابة الكائن إلى قاعدة البيانات ، ثم إنشاء كائن طالب ، وإضافة كائن الطالب إلى كائن الفئات ؛ والآخر هو إنشاء كائن طالب أولاً ، وكتابة كائن الطالب إلى قاعدة البيانات ، ثم إنشاء كائن فصول لإضافة كائن الطالب إلى كائن الفصول. يختلف هذان النوعان من العمليات في النهاية ، لذلك دعونا نقارن.
3.1 اكتب الفصل أولاً ثم اكتب الطلاب
بعد كتابة الفصل إلى قاعدة البيانات أولاً ، يدخل كائن الفئات الحالة العابرة ولديه صف في قاعدة البيانات. ثم اكتب كائن الطالب. سيبحث كائن الطالب عن المفتاح الأساسي للفئات المقابلة ويكتبه على الجدول. لذلك ، فإن البيانات الموجودة في نموذج العلاقة غير فارغة ، والرمز المحفوظ كما يلي:
public void testSave () {جلسة الجلسة = null ؛ حاول {// إنشاء جلسة كائن جلسة = hibernateutils.getSession () ؛ // Open Transaction Session.BeginTransaction () ؛ // إنشاء كائن فئة وكتابة كائن فئة إلى فئات فئات قاعدة البيانات = فئات جديدة () ؛ classes.setName ("class") ؛ Session.save (الفصول) ؛ // إنشاء كائن طالب 1 وكتابة كائن الطالب إلى طالب قاعدة البيانات 1 = طالب جديد () ؛ student1.setName ("Zhangsan") ؛ student1.setClasses (الفصول) ؛ Session.save (student1) ؛ // إنشاء كائن الطالب 2 واكتب كائن الطالب إلى طالب قاعدة البيانات 2 = طالب جديد () ؛ student2.setName ("Lisi") ؛ student2.SetClasses (الفصول) ؛ Session.save (student2) ؛ session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} قائمة المعلومات المقابلة في قاعدة بيانات الكتابة هي كما يلي:
3.2 اكتب الطلاب أولاً ثم الفصل
أولا اكتب الطلاب في قاعدة البيانات. في هذا الوقت ، نظرًا لأن جدول الطالب يحتاج إلى الحصول على المعلومات الرئيسية الأساسية لعمود الفئة المقابلة ، ولكن نظرًا لأن معلومات الفصل يتم تحويلها إلى الحالة العابرة ، فستكون هناك قيمة فارغة عند كتابة معلومات الطالب. الرمز كما يلي:
طريقة عرض قاعدة البيانات المقابلة بعد الكتابة هي كما يلي:
بمقارنة العمليتين للكتابة ، تظهر نتائج مختلفة لأن ترتيب كتاب الاثنين مختلف ، ولكن لأنه ارتباط ثنائي الاتجاه ، لا يحدث استثناء أثناء الكتابة.
4. قراءة العملية
مقارنة بكتابة البيانات ، تصبح قراءة البيانات بسيطة للغاية. لأنها جمعية ثنائية الاتجاه ، فإن قراءة البيانات هي أيضًا ثنائية الاتجاه. يمكن قراءة المعلومات من الطرف الآخر من أي نهاية ، كما هو موضح في الكود التالي:
public void testload1 () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ // اقرأ معلومات الطالب من خلال فصول الفصل الدراسي = (الفصول) SESSE.LOAD (classes.class ، 1) ؛ System.out.println ("classes.name ="+classes.getName ()) ؛ تعيين الطلاب = الفصول. getStudents () ؛ لـ (iterator iter = students.iterator () ؛ iter.hasnext () ؛) {student student = (student) iter.next () ؛ System.out.println ("student.name ="+student.getName ()) ؛ } // قراءة معلومات الفصل من خلال معلومات الطالب Stu = New Student () ؛ stu = (student) session.load (student.class ، 1) ؛ System.out.println ("تحميل معلومات الفئة من خلال فصول الطلاب. session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}قم بتشغيل بيان الاختبار أعلاه ومعلومات العبارة المقابلة التي تم إنشاؤها على النحو التالي:
hibernate: حدد classes0_.id as id1_0_ ، classes0_.name as name1_0_ from t_classes classes0_ where classes0_.id =؟ classes.name = class hibernate: حدد students0_.classesid as classID1_ ، students0_.id as id1_ ، students0_.id as id0_0_ ، students0_.name as name0_0_ ، students0_.classesid as classid0_0_ from t_student students0_ where student0_classesid = student.name = lisi student.name = Zhangsan
تحميل معلومات الفصل بواسطة فصول الطلاب.