1. جمعية المفتاح الأساسي ثنائي الاتجاه
جمعية المفتاح الرئيسي ثنائي الاتجاه هي في الواقع حالة خاصة للجمعية الرئيسية الفردية. ومع ذلك ، يجب إجراء التكوين <-2 إلى واحد في ملفات التعيين في كلا طرفي الكائن المرتبط ، وبالإضافة إلى ذلك ، يجب استخدام سمة ارتباط المفتاح الأجنبي الأجنبي في أحد طرفي المفتاح الأساسي للخريطة الرئيسية.
هنا نستخدم أيضًا الشخص و Idcard للمناقشة. يتوافق الشخص مع بطاقة هوية فريدة من نوعها ، كما أن بطاقة الهوية تقوم أيضًا بتعيين شخص فريد من نوعه ، لذلك يخلق هذا علاقة بالرباطين في اتجاهين. المفتاح الأساسي للشخص هو أيضًا المفتاح الرئيسي لـ IDCARD ، والتي هي مفاتيح أساسية ومفاتيح أجنبية. تصبح علاقة الارتباط هذه بمثابة رسم خرائط ثنائي الاتجاه ، يمكن التعبير عنه في نموذج العلاقة كما هو موضح أدناه:
يستخدم الجدولين في الشكل ارتباط المفتاح الأساسي. المفتاح الأساسي للشخص هو المفتاح الأساسي لـ IDCARD ، لذلك يشكلون علاقة قياسية بين مفاتيح ZHU الأجنبية ، وضمان التفرد ، وقم بتخطيطها في نموذج الكائن ، وتحويلها إلى علاقة فردية بين فئة الشخص وفئة IDCARD ، كما هو موضح في الشكل أدناه:
هذه العلاقة الفردية المذكورة أيضًا في المقالة السابقة التي تفيد بأن العلامة <لواحد> يتم استخدامها ، وأن رسم الخرائط الفردي ثنائي الاتجاه ، لذلك نحن بحاجة إلى تكوين <ston-one> بين كائنين في نفس الوقت. أولاً ، دعونا نلقي نظرة على رمز الفصل ورمز الملف المقابل لـ IDCard.
1. المعلومات المقابلة لـ IDCARD
هناك علاقة فردية بين فئة idcard.java وفئة idcard وفئة الشخص. لذلك ، يجب إضافة سمة الشخص المقابل إلى فئة idcard. هذا هو إضافة السمات المقابلة إلى المفاتيح الأجنبية في ملف التعيين وتعيين فئة جمعية المفاتيح الخارجية المقابلة.
حزمة com.src.hibernate ؛ الفئة العامة idcard {// id attribute private int id ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } // رقم البطاقة سمة السلسلة الخاصة cardno ؛ السلسلة العامة getCardno () {return cardno ؛ } public void setCardNo (String cardno) {this.cardno = cardno ؛ } // الأشخاص المقابلون لرقم البطاقة الشخص الخاص الشخص العام getPerson () {return person ؛ } public void setPerson (person) {this.person = person ؛ }}يضيف ملف تعيين IDCard.hbm.xml شخصًا سمة مفتاح خارجي إلى ملف التعيين ويضيف علامة <-2 إلى واحد>. والغرض من ذلك هو إجبار فئة القيد على تحقيق علاقة رسم خرائط فردي. أخيرًا ، قم بتعيين السمة المقيدة على True في التعيين لضمان علاقة القيد القسري.
<؟ <hibernate mapping> <class name = "com.src.hibernate.idcard" table = "idcard"> <id name = "id" type = "int" مقيدة = "true"> </son-in-one> </class> </hibernate mapping>
2. الشخص المقابل
في فئة person.java ، بالإضافة إلى إضافة السمات الأساسية ، يجب إضافة فئة idcard المقابلة كسمات ، لأنها علاقة ارتباط ثنائية الاتجاه ، لذلك يجب أيضًا إضافة فئة IDCARD إلى فئة الشخص. والسبب نفسه هو أنه تتم إضافة سمات فئة الشخص أيضًا إلى فئة IDCARD.
حزمة com.src.hibernate ؛ شخص الطبقة العامة {// رقم المعرف الخاص int id ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } // اسم اسم السلسلة الخاصة ؛ السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } // idcard private idcard idcard ؛ public idcard getIdCard () {return idcard ؛ } public void setIdCard (idcard idcard) {this.idcard = idcard ؛ }}person.hbm.xml ملف تعيين ، استراتيجية توليد المفاتيح الأساسية في هذا الملف لا تحتوي على متطلبات خاصة لأنها مقيدة بشكل متبادل بواسطة فئة IDCard. المفتاح الأساسي والمفتاح الأجنبي هما المفتاح الرئيسي للبطاقة. بالإضافة إلى ذلك ، نظرًا لأنها علاقة فردية ، يجب إضافة العلامة <لواحد> إلى ملف التعيين للإشارة إليها.
<؟ <hibernate-mapping> <class name = "com.src.hibernate.person" table = "person"> <id name = "id" type = "int" column = "personid"> </generator> </id> <property name = "name" type = "string" column = بشكل افتراضي ، يتم تحميله وفقًا للمفتاح الأساسي ، أي أنه يحصل على قيمة حقل العلاقة ويحمل الكائن المرتبط به وفقًا للمفتاح الأساسي للخصم-> <name من فرد واحد = "idcard"> </واحد إلى واحد> </class> </hibernate mapping>
3. ملف رسم الخرائط السباتي
بعد تكوين ملف الفئة أعلاه والتعيين ، مطلوب معلومات حول تعيين قاعدة البيانات في hibernate.cfg.xml لإضافة ملفين للتكوين إلى ملف تكوين Hibernate ، بحيث يمكن العثور على عناصر الجيل المقابلة عند إنشاء قاعدة البيانات المقابلة.
<؟ <Session-factory> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </spreent name = "hibernate.connection.username"> الجذر </property> <property name = "hibernate.connection.password"> 1234 </property> <property name = "hibernate.dialect"> org.dibernate.dialect.mysqldialect </propert Resource = "com/src/hibernate/idcard.hbm.xml"> </tingling> </session-factory> </hibernate-configuration>
4. توليد النتائج
بعد اكتمال التكوين ، يمكنك إنشاء قاعدة البيانات المقابلة من المحتوى أعلاه. في قاعدة البيانات ، ستقوم بإنشاء بنية الجدول المقابلة وفقًا للمحتوى الذي تم تكوينه ، وهناك مفاتيح أجنبية مقابلة وحقول المفاتيح الأساسية في الجدول. عند توليد بنية الجدول ، ستخرج السبات في عبارة SQL المقابلة في وحدة التحكم ، على النحو التالي:
تغيير جدول IDCard Drop المفتاح الأجنبي FK806F76ABAC038CD8 جدول إسقاط إذا كان موجودًا جدول إسقاط IDCARD إذا كان هناك شخص موجه إنشاء جدول IDCARD (عدد صحيح الشخصي غير فارغ ، personname (255) FK806F76ABAC038CD8 (PersonID) ، إضافة القيد FK806F76ABAC038CD8 المفتاح الأجنبي (الشخص الشخصي) مراجع المراجع (personID)
بنية الجدول التي تم إنشاؤها كما هو موضح في الشكل:
يتم إنشاء المفتاح الأساسي الشخصي في كلا الجدولين في نفس الوقت ، وهو أيضًا المفتاح الخارجي المقابل. كما أنه يقيد المفاتيح الأساسية للجدولين في نفس الوقت وهو فريد من نوعه.
5. اكتب وتحميل اختبار
بعد إنشاء الجدول ، اكتب الجدول وقراءة البيانات من الجدول ، واكتب فئة الاختبار المقابلة ، ويستخدم الاختبار اختبارات الوحدة ويكتب طرق الاختبار المقابلة.
5.1 اكتب اختبار
عند الكتابة إلى قاعدة البيانات ، تأكد من ملاحظة أنه يجب تحويل كلا الكائنين المكتوبة إلى حالة التدريب المقابلة ، وإلا فإن خطأ تحويل الحالة سيحدث. رمز الاختبار كما يلي:
public void testSave1 () {جلسة الجلسة = null ؛ حاول {// إنشاء جلسة كائن جلسة = hibernateutils.getSession () ؛ // تمكين جلسة الجلسة. begintransaction () ؛ // إنشاء كائن شخص وحفظ الشخص = شخص جديد () ؛ person.setName ("Zhangsan") ؛ Session.save (شخص) ؛ // إنشاء كائن idcard وحفظ idcard idcard = new idcard () ؛ idcard.setcardno ("111111111111") ؛ idcard.setperson (شخص) ؛ Session.save (idcard) ؛ // إرسال المعاملات وتعديل جلسة قاعدة البيانات. } catch (استثناء e) {// print error message E.PrintStackTrace () ؛ // Business Rollback Session.getTransaction (). Rollback () ؛ } أخيرًا {// أغلق الجلسة hibernateutils.closedessession (الجلسة) ؛ }} يظهر أدناه البيانات المدرجة:
5.2 اختبار التحميل
اكتب طريقة تحميل. نظرًا لأن علاقة الارتباط ثنائية الاتجاه ، يجب أن تكون عملية التحميل المقابلة لتحميل الطرف الآخر من خلال نهاية واحدة ، أي الحصول على فئة الشخص المقابلة ، والحصول على معلومات IDCARD المقابلة من خلال فئة الشخص. يجب أن يكون العكس صحيحًا أيضًا ، الرمز هو كما يلي:
public void testload1 () {جلسة الجلسة = null ؛ حاول {// إنشاء جلسة كائن جلسة = hibernateutils.getSession () ؛ // تمكين جلسة الجلسة. begintransaction () ؛ // احصل على كائن الشخص وحفظ الشخص = (الشخص) session.load (person.class ، 5) ؛ System.out.println ("idcard.id:"+person.getIdCard (). getId ()) ؛ System.out.println ("idcard.cardno:"+person.getIdCard (). getCardno ()) ؛ // إنشاء كائن idcard وحفظ idcard idcard = (idcard) session.load (idcard.class ، 5) ؛ System.out.println ("person.id:"+idcard.getPerson (). getId ()) ؛ System.out.println ("person.name:"+idcard.getPerson (). getName ()) ؛ // إرسال المعاملات وتعديل Session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {// print error message E.PrintStackTrace () ؛ // Business Rollback Session.getTransaction (). Rollback () ؛ } أخيرًا {// أغلق الجلسة hibernateutils.closedessession (الجلسة) ؛ }} قم بتشغيل طريقة الاختبار أعلاه وطباعة المحتويات ذات الصلة على وحدة التحكم على النحو التالي:
2. علاقة مفتاح خارجي ثنائي الاتجاه
يمكن فهم جمعية المفتاح الخارجية ثنائية الاتجاه على أنها حالة خاصة للجمعية الرئيسية الخارجية. هذا التخصص هو بشكل أساسي لأنه مراسلات ثنائية الاتجاه. في المقالة السابقة ، تم الإشارة إلى أنه إذا كنت ترغب في إضافة حقل مفتاح خارجي إلى جدول ، فيمكنك استخدام علامة <-to-One> ، والتي ستولد عمود المفاتيح الخارجية المقابلة في نموذج العلاقة. يجب استخدام هذه العلامة إذا كنت ترغب في تحقيق جمعية مفتاح خارجية في اتجاهين.
1. نموذج الكائن
دعونا نلقي نظرة أولاً على نموذج الكائن. الأشخاص وبطاقات الهوية هي علاقة فردية. شخص واحد يتوافق مع الهوية ، وبالتالي فإن التعددية بينهما هي واحدة إلى واحد ، وهذه المراسلات في اتجاهين. لذلك ، فإن نموذج الكائن الخاص به هو نفس المفتاح الأساسي ثنائي الاتجاه واحد إلى واحد ، كما هو موضح في الشكل أدناه:
2. النموذج العلائقي
سوف يتغير نموذج العلاقة المقابلة بشكل كبير. ستقوم علاقة المفتاح الخارجي الفردي بإنشاء المفتاح الخارجي المقابل في الجدول. عندما تحصل على الشخص وبطاقة الهوية ، فهذا يعني أنه سيكون هناك عمود مفتاح أساسي لرقم بطاقة الهوية في نموذج العلاقة ، ويتم تشكيل موقف ثنائي الاتجاه بينهما ، كما هو موضح في الشكل أدناه:
المراسلات بينهما كما هو موضح في الشكل أعلاه. هناك المفتاح الأساسي لجدول IDCARD في جدول الشخص ، ويشكل علاقة بين علاقة مفتاح خارجي فردي ، وهو ثنائي الاتجاه. بمعنى أنه يمكن الحصول على بطاقة IDCARD من خلال الشخص ، ويمكن أيضًا الحصول على الشخص من خلال IDCARD.
الرمز في كائن الشخص وكائن idcard هو نفسه رمز الكائن في المقالة السابقة. لم يتم سرده في الكود. الفرق الوحيد هو مشكلة التكوين في ملف التعيين.
3. رسم خرائط الملفات
idcard.hbm.xml ملف تعيين. لا يعد جدول IDCard هو الجدول الرئيسي للرسم التعريفي ، لذلك عند القيام بتنسيق فردي ، تحتاج إلى استخدام العلامة <لواحد> لتكوينها ، وتحتاج إلى صياغة سمات المفاتيح الخارجية في نموذج علاقة الشخص. الرمز المحدد كما يلي:
<؟ -> <hibernate mapping> <class name = "com.src.hibernate.idcard" table = "idcard"> <id name = "id" type = "int"> <generator /> </id> <property name = "cardno" type = "java.lang.String"> <colorno = "cardno" Property-REF = "IDCARD"> </son-in-one> </class> </shibernate mapping>
person.hbm.xml ملف رسم الخرائط ، جدول الشخص هو الجدول الرئيسي للرسم الخرائط. يجب إضافة عمود سمة مفتاح خارجي إلى الجدول للإشارة إلى جدول IDCARD. لذلك ، يجب استخدام العلامة <-to-One> هنا لإنشاء المفتاح الخارجي المقابل في كائن الشخص ، ويجب أن تستخدم الفريدة أيضًا فريدة للإشارة إلى أن السمة فريدة من نوعها.
<؟ -> <hibernate mapping> <class name = "com.src.hibernate.person" table = "person"> <id name = "id" type = "int" فريد = "true" not-null = "true"> </to to one> </slass> </hibernate mapping>
يتم إكمال تكوين ملف التعيين للكائن ، ثم يتم إنشاء نموذج علائقي. بيان SQL كما يلي:
alter table PERSON drop foreign key FK8C768F55794A52CA drop table if exists IDCARD drop table if exists PERSON create table IDCARD (id integer not null auto_increment, CARDNO varchar(255), primary key (id)) create table PERSON (personId integer not null auto_increment, NAME varchar(255), idCardNo integer not null unique, primary key (PersonId)) تغيير الجدول الشخص إضافة فهرس FK8C768F55794A52CA (IDCARDNO) ، إضافة القيد FK8C768F55794A52CA المفتاح الأجنبي (IDCARDNO) المراجع IDCARD (ID)
عبارة SQL التي تم إنشاؤها هي أولاً وقبل كل شيء الجدول الذي تم إنشاؤه. عند إنشاء الجدول ، يتم تحديد عمود المفتاح الأساسي. بعد اكتمال الإنشاء ، يتم تعديل الجدولين لتحديد سمات المفاتيح الخارجية لتشكيل علاقة فردية.
اكتب طريقة اختبار ، واعتماد اختبارات الوحدة ، وتحميل كائنات من فئتين ، والحصول على كائن آخر من طرف واحد من الكائن على التوالي
// قم بتحميل الكائن وتحميل كائن الشخص باستخدام IDCard Object public void testload1 () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ // احصل على كائن idcard واحصل على كائن الشخص المرتبط بشكل فريد بالكائن في idcard idcard idcard = (idcard) session.load (idcard.class ، 1) ؛ System.out.println ("person.id ="+idcard.getPerson (). getId ()) ؛ system.out.println ("idcard.person.name ="+idcard.getPerson (). getName ()) ؛ // getPerson Object والحصول على كائن idcard الذي يرتبط بشكل فريد به في شخص الشخص الشخصي = (الشخص) session.load (person.class ، 1) ؛ System.out.println ("idcard.id:"+person.getIdCard (). getId ()) ؛ System.out.println ("idcard.cardno:"+person.getIdCard (). getCardno ()) ؛ // الالتزام بالمعاملة Session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} المحتوى المولد:
مقارنة بين علاقات التعيين ، والعلاقات الرئيسية في رسم الخرائط المفتاح والخارجية هي علاقات رسم الخرائط ثنائية الاتجاه ، ويجب تكوين علاقة التعيين في نفس الوقت في كلا طرفي الكائن. الفرق هو أن المفتاح الأساسي يحتاج فقط إلى استخدام <ston-one> لأنه لا يحتاج إلى إنشاء أعمدة السمات ، ولكن يجب استخدام استراتيجية توليد المفاتيح الأساسية الأجنبية للمفتاح الأساسي للجدول ويتم وضع علامة على كائن المفتاح الأجنبي ؛ تحتاج استراتيجية توليد المفاتيح الخارجية إلى استخدام علامة <-to-One> لإنشاء أعمدة مفاتيح خارجية جديدة.
خاتمة
تمت مناقشة رسم الخرائط الفردية في جمعية ثنائية الاتجاه حتى الآن. تناقش المادتان أساسا استخدامين لجمعية ثنائية الاتجاه. في الواقع ، لا يزال الأمر بسيطًا للغاية. تذكر أن تستخدم علامة <-to one> إذا كنت ترغب في إنشاء مفتاح خارجي. إذا كانت فريدة من نوعها ، أضف السمة الفريدة. تشير العلامة <لواحد> فقط إلى علاقة فردية. إنه يشير فقط إلى كيفية تحميل كائن آخر كائن آخر ولا يضيف عمودًا جديدًا في نموذج العلاقة. ستناقش المقالة التالية العلاقات بين العدد.