أجرت Hibernate تصنيفًا وتكاملًا ووجد أن السبات ينقسم فعليًا إلى ثلاثة أجزاء: الكائن الأساسي ، والتعيين ، و HQL. هذه الأجزاء الثلاثة هي الأكثر استخدامًا في عملية التطوير. تناقش المقالات السابقة طرق التحويل بين الكائنات الأساسية والكائنات. بعد ذلك ، ناقش أساليب استخدام رسم الخرائط للإسبات.
وظيفة مهمة من السبات هي رسم الخرائط ، والتي يمكن أن تتحول بين نموذج الكائن والنموذج العلائقي. ويدافع عنها أفكار البرمجة الموجهة نحو الكائن. يحتاج المطورون الذين يستخدمون برامج التعيين فقط إلى الاهتمام بكتابة الكود في نموذج الكائن. عادة ما يتم تعريف التعيين بين كائن وقاعدة بيانات علائقية بواسطة مستند XML. تم تصميم وثيقة التعيين هذه لتكون قابلة للقراءة ويمكن تعديلها يدويًا. أنا لخصت علاقة التعيين هذه كما هو موضح في الشكل التالي:
يتم تعريف التعيين من خلال XML ، وإدارته باستخدام الجلسة التي تم إنشاؤها بواسطة Hibernate ، وأخيراً تستخدم الجلسة JTA لإرسال التغييرات إلى قاعدة البيانات. يمكن فهم الجلسة كمدير ثبات ، يدير الأشياء في طبقة الثبات. تم إنشاؤه بواسطة SessionFactory. عند البرمجة باستخدام Hibernate ، يجب عليك أولاً الاتصال بقاعدة البيانات ، لذلك يجب عليك أولاً التحقق من تكوين اتصال قاعدة البيانات في XML ، وإنشاء SessionFactory وفقًا لتكوين المستند (الذي يمكن فهمه على أنه مرآة قاعدة بيانات) ، ثم إنشاء SessionFactory. أخيرًا ، ستقدم الجلسة التغييرات على قاعدة البيانات بشكل موحد ، والتي ستكمل جميع العمليات.
عملية الاستخدام
1. إنشاء ملف رسم الخرائط ، ويتم لاحقة ملف التعيين مع .hbm.xml ، مما يشير إلى أنه ملف رسم الخرائط لإسبات ؛
2. قم بتسجيل فئة الكيان في ملف التعيين وإضافة خصائص فئة الكيان إلى فئة التعيين. عند إضافة خصائص ، يجب عليك تحديد قيمتين: المعرف والخاصية. يشير المعرف إلى أنه هو المعرف الوحيد لكيان ، ويشير الخاصية إلى أنه عمود حقل للجدول ؛
3. إرسال التعديلات وتوليف البيانات.
ملاحظة: سوف يفهم المطورون الذين طوروا بيانات XML إلى قاعدة البيانات قريبًا أن هذا التعيين هو في الواقع عملية تحديث الدُفعات وإنشاء الدُفعات ، والتعيين ليس استثناءً. ينص السبات على مجموعة من معايير التعيين التي يمكن تحويلها وفقًا للمعايير. لا يزال تنفيذها الداخلي ميتًا ، لذلك فهو مرن نسبيًا وسهل الاستخدام.
عملية رسم خرائط فئة بسيطة:
1. رمز خاصية فئة الكيان المستخدم 1:
حزمة com.hibernate ؛ استيراد java.util.date ؛ الفئة العامة user1 {private string id ؛ اسم السلسلة الخاصة ؛ كلمة مرور السلسلة الخاصة ؛ تاريخ خاص CreateTime ؛ موعد خاص انتهاء الصلاحية ؛ السلسلة العامة getId () {معرف الإرجاع ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } السلسلة العامة getPassword () {return password ؛ } public void setPassword (سلسلة كلمة مرور) {this.password = password ؛ } التاريخ العام getCreateTime () {return createTime ؛ } public void setCreateTime (DateTeTime) {this.createTime = createTime ؛ } التاريخ العام getExpiretime () {return Expiretime ؛ } public void setExpiretime (Date Expiretime) {this.expiretime = Expiretime ؛ }}
2. تنفيذ الكود الداخلي لـ user1.hbm.xml من ملف التعيين user1.java:
يتم أيضًا توفير الإعدادات التي يمكن تعيينها في قاعدة البيانات الأساسية أيضًا في السبات. يمكنك استخدام سمات التسمية لوضع علاقات محددة رسم الخرائط.
الفئة> الجداول تستخدم علامات الفئة ، والخصائص الشائعة الاستخدام:
(1) الاسم: فئة كيان الخريطة ، يجب ضبط قيمتها على اسم فئة الكيان التي يجب تحويلها إلى جدول. أثناء التزامن ، سيتم العثور على فئة الكيان المقابلة بناءً على هذه السمة.
(2) الجدول: خريطة اسم جدول قاعدة البيانات. إذا كان اسم الجدول المراد تعيينه يختلف عن اسم فئة الكيان ، فاستخدم هذه الخاصية لتحديد الجدول المعين. إذا لم يكن موجودًا ، فسيتم إنشاء جدول بناءً على قيمة الخاصية.
تحقق من بنية الجدول التي تم إنشاؤها بواسطة التكوين في الشكل أعلاه ، كما هو موضح أدناه:
تم تغيير اسم الجدول إلى T_USER1 ؛ يتم تغيير حقل المعرف إلى user_id ، وطول الحقل هو 32 بت ؛ يتم تعيين خاصية CreateTime إلى حقل قاعدة البيانات Create_time ، ويتم تعديلها حتى الآن.
الخاصية -> الحقول تستخدم معرف أو علامات خاصية ، خصائص شائعة الاستخدام:
(1) الاسم: تشبه الوظيفة اسم علامة الفصل ، وتحدد القيمة اسم سمة التعيين لفئة الكيان ؛
(2) العمود: على غرار جدول علامة فئة الكيان ، تحديد اسم العمود لجدول التعيين ، وسيتم إنشاؤه إذا لم يكن موجودًا ؛
(3) اكتب: حدد نوع البيانات المعين إلى الحقول في قاعدة البيانات وعرض المستند حسب الحاجة ؛
(4) يتم استخدام المولد ، وهو اختياري ، لإنشاء معرف فريد لفئة ثابتة.
<id name = "id" type = "long" column = "cat_id"> <generator> <param name = "table"> uid_table </param> <param name = "column"> next_hi_value_column </param> </servelator> </id>
جميع المولدات تنفذ واجهة org.hibernate.id.InderifierGenerator. هذه واجهة بسيطة للغاية. يمكن أن تختار بعض التطبيقات توفير تنفيذها المحدد. بالطبع ، يوفر Hibernate الكثير من التطبيقات المدمجة. فيما يلي بعض الأنواع الشائعة الاستخدام:
(1) الهوية: المعرف الذي تم إرجاعه من النوع طويل أو قصير أو int. على غرار حقل القاعدة الذاتية للذات.
(2) التسلسل: استخدم التسلسلات في DB2 ، PostgreSQL ، Oracle ، SAP DB ، MCKOI ، والمولدات في interbase. المعرف الذي تم إرجاعه من النوع طويل أو قصير أو int. في قاعدة البيانات بأكملها ، بدلاً من التزايد الذاتي في جدول واحد ، تحتاج إلى تحديد أن التزايد الذاتي في جدول واحد يحتاج إلى إضافة.
(3) UUID: استخدم خوارزمية UUID 128 بت لإنشاء معرف نوع السلسلة ، وهو فريد من نوعه في الشبكة (باستخدام عنوان IP). يتم ترميز UUID كسلسلة من الأرقام السداسية 32 بت. على غرار الرقم التسلسلي الناتج عن .NET.
(4) الأصلي: اختر واحدة من الهوية أو التسلسل أو Hilo بناءً على قدرات قاعدة البيانات الأساسية. بطريقة مرنة ، سيتم تحديد نوع الهوية المستخدم بناءً على قاعدة البيانات المستخدمة. سيقوم MySQL بتحديد الهوية وسيقوم Oracle بتحديد التسلسل.
(5) تم تعيينه: قم بإنشاء معرف تعريف يدويًا لفئة الكيان. هذه هي سياسة التوليد الافتراضية عندما لا يتم تحديد عنصر <enderator>.
(6) أجنبي: استخدم معرف كائن آخر مرتبط. عادة ما تستخدم في تركيبة مع <واحد إلى واحد>.
غالبًا ما يتم استخدام المطورين في طريقة التكوين اليدوي لكتابة خصائص التكوين وفقًا لتعليمات الوثائق. هذا بدائي للغاية. يوصي المبتدئون باستخدام طريقة التكوين اليدوي للمساعدة في التفكير. هناك أيضًا العديد من أدوات الطرف الثالث التي تستخدم الطرق المرئية لتكوين وإنشاء مستندات تكوين XML ، مما يحسن كفاءة التطوير. أدوات مماثلة مثل XDoclet و Middlegen و Andormda.
التعيينات الترابطية كثيرة إلى واحد
وتناقش التعيين الأساسي للإسبات أعلاه. تتوافق فئة الكيان مع جدول وتستخدم رسم خرائط العلامة <Class> في ملف تعيين السبات المقابل. وتتوافق الخصائص العادية في فئة الكيان مع حقل الجدول ويتم تعيينها باستخدام علامة <Puranriation>. بالإضافة إلى ذلك ، عند إنشاء فئات الكيانات ، يجب أن تنتبه إلى: يجب تنفيذ المنشئ الافتراضي بدون معلمات في فئات الكيانات ، ويجب توفير الملصق. يوصى بعدم استخدام النهائي لتعديل فئة الكيان وإنشاء أساليب Getter و Setter لفئة الكيان. أخيرًا ، يتم تقديم العديد من استراتيجيات توليد المفاتيح الأساسية الرئيسية ، والخطوة التالية هي مناقشة العديد من الخرائط.
ينعكس هذا التعيين العديد من الارتباط في نموذج الكائن. إنها علاقة تجميع. المستخدم جزء من المجموعة. هناك مستخدمون في المجموعة. دورات حياتهم مختلفة ويمكن أن تنعكس في الشكل التالي:
فكيف يتم تعيين ارتباط العديد من العلاقات في السبات؟ سيقوم ما يلي بتقديم طريقتين: استخدم علامة <-to-One> لتحديد الخريطة مباشرة ، أو استخدام Cascade <-to واحد> لتعديل الجدول.
1. العديد من التعيين المباشر <BR /> يمكن فهمه من المعنى الحرفي الذي يشير إلى علاقة كثيرة. يشير الكثير إلى النهاية ، ويشير أحدهم إلى نهاية أقل. عند استخدامه ، غالبًا ما يتم استخدام العلامة في HBM من النهاية ، ويتم تعيين سمة الاسم لـ <العديد إلى واحد> على سمة واحدة من طرف واحد في الفئة المقابلة من ملف التعيين ، مثل: <to to to to to to on-one = "group" column = "GroupID"> </to واحد إلى واحد>. تتم إضافة هذه العلامة إلى user.hbm.xml ، والتي تتوافق مع الكثيرين ؛ قيمة الاسم في العلامة هي مجموعة لتعيين واحد ، وستكون هناك سمة تسمى المجموعة في user.java. بعد ذلك ، دعونا نلقي نظرة على فئة التعليمات البرمجية المحددة التي تنفذ التنفيذ.
(1) رمز فئة user.java ، الذي يحتوي على خاصية تسمى Group ، والتي سيتم استخدامها كقيمة الاسم لنهاية واحدة <-to one>.
مستخدم الفئة العامة {اسم السلسلة الخاصة ؛ السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ مجموعة المجموعة الخاصة ؛ المجموعة العامة getGroup () {return Group ؛ } public void setGroup (Group Group) {this.group = group ؛ }}(2) قيمة اسم <-to واحد> في user.hbm.xml هي قيمة خاصية الجانب الواحد في user.java. سيقوم بإنشاء عمود جديد في قاعدة البيانات ، والذي يمكن فهمه كمفتاح خارجي لجدول المستخدم.
<؟ -> <hibernate mapping> <class name = "com.hibernate.user" table = "user"> <id name = "id" type = "java.lang.long"> <column name = "id" /> <generator /> </id> <!-قيمة الاسم هي خاصية في مستخدم. سيقوم تلقائيًا بإنشاء عمود في الجدول ، بحيث تتم إعادة تسمية العمود باستخدام العمود-> <to to one name = "group" column = "groupid"> </ano to واحد> </class> </hibernate mapping>
(3) اختبر علاقة التعيين أعلاه ، اكتب كائنين مستخدمين في الجدول ، اسمه ats user1 و user2 ، قم بتسمية Zhang San و Li Si ، استخدم الجلسة لحفظ الكائن ، وكتابة البيانات إلى قاعدة البيانات ، والرمز كما يلي:
public void testSave1 () {جلسة الجلسة = null ؛ حاول {session = getSession.getSession () ؛ Session.begintransaction () ؛ مجموعة المجموعة = مجموعة جديدة () ؛ Group.setName ("Power Node") ؛ المستخدم المستخدم 1 = مستخدم جديد () ؛ user1.setName ("Zhang San") ؛ user1.setGroup (Group) ؛ المستخدم المستخدم 2 = مستخدم جديد () ؛ user2.setName ("li si") ؛ user2.setGroup (Group) ؛ Session.save (user1) ؛ Session.save (user2) ؛ // سيتم الإبلاغ عن خطأ transientObjectexception // يحدث الخطأ عند تنظيف ذاكرة التخزين المؤقت transientObjectexception // لأن المجموعة هي حالة عابرة ، فهي غير موجودة ، ولا توجد بيانات مطابقة في قاعدة البيانات // عندما يكون المستخدم مستمرًا في حالة التغير//لا يمكن العثور session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {getSession.closesession (الجلسة) ؛ }}ومع ذلك ، عند استخدام الكود أعلاه ، سيتم الإبلاغ عن transientObjectexception عند تنفيذ الكتابة. هذا لأنه عند حفظ كائن المستخدم ، سوف يبحث عن كائنات المجموعة في الذاكرة وفقًا للمجموعة المضافة في <العديد إلى واحد>. ومع ذلك ، في الكود أعلاه ، كان كائن المجموعة دائمًا في حالة عابرة ولا تتم إدارته بواسطة الجلسة ، مما يعني أنه لا يمكن العثور على كائن الجلسة ، ويدخل كائن المستخدم الحالة المستمرة ، لذلك سيتم الإبلاغ عن هذا الخطأ. الرمز الصحيح كما يلي:
public void testSave2 () {جلسة الجلسة = null ؛ حاول {session = getSession.getSession () ؛ Session.begintransaction () ؛ مجموعة المجموعة = مجموعة جديدة () ؛ Group.setName ("Power Node") ؛ Session.Save (Group) ؛ // قم بتعيين كائن المجموعة هنا على مستخدم مستخدم الكائن المستمر 1 = مستخدم جديد () ؛ user1.setName ("Zhang San") ؛ user1.setGroup (Group) ؛ المستخدم المستخدم 2 = مستخدم جديد () ؛ user2.setName ("li si") ؛ user2.setGroup (Group) ؛ Session.save (user1) ؛ Session.save (user2) ؛ // يمكن حفظ البيانات بشكل صحيح // لأن المجموعة والمستخدم هما كائنات في حالة مستمرة // يمكن العثور على الكائن المرتبط به في الجلسة عندما يقوم Hibernate بتنظيف جلسة ذاكرة التخزين المؤقت. } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {getSession.closesession (الجلسة) ؛ }} 2. رسم الخرائط المتتالية
بالإضافة إلى تحويل كل من كائن المجموعة وكائن المستخدم إلى الكائن المستمر المذكور أعلاه ، يمكنك أيضًا استخدام سمات تعيين Cascade Cascade ، وإضافة سمة Cascade في السمة <-to one> ، ونسخها إلى حفظ العمدة. يمكنك الكتابة إلى قاعدة البيانات عندما لا يكون كائن المجموعة في الحالة المستمرة. وبهذه الطريقة ، تحتاج فقط إلى تعيين سمات المجموعة لكائنا المستخدمين على نفس كائن المجموعة لتحقيق علاقة تعيين كثيرة. في هذا الوقت ، فإن المحتوى المقابل في user.hbm.xml هو الكود التالي:
<؟ -> <hibernate mapping> <class name = "com.hibernate.user" table = "user"> <id name = "id" type = "java.lang.long"> <column name = "id" /> <generator /> </id> <! </class> </hibernate mapping>
ملاحظة: بعد تعيين Cascade لتوفير التحديث ، يمكن أن يتم تعديله المتتالي والإضافة والحذف إلى قاعدة البيانات ، ولكن لا يمكن إجراء عملية استعلام Cascade المحددة.
طريقة ملف تكوين الاختبار المقابلة هي كما يلي:
// Cascade Cascade public void testSave3 () {Session Session = null ؛ حاول {session = getSession.getSession () ؛ Session.begintransaction () ؛ مجموعة المجموعة = مجموعة جديدة () ؛ Group.setName ("Power Node") ؛ المستخدم المستخدم 1 = مستخدم جديد () ؛ user1.setName ("Zhang San") ؛ user1.setGroup (Group) ؛ المستخدم المستخدم 2 = مستخدم جديد () ؛ user2.setName ("li si") ؛ user2.setGroup (Group) ؛ Session.save (user1) ؛ Session.save (user2) ؛ // لم يتم إلقاء TransientObjectexception // نظرًا لأن Cascade يستخدم // ستقوم Hibernate أولاً بحفظ مجموعة الكائن المرتبطة بالمستخدم // مجموعة ومستخدم كلاهما في جلسة الحالة المستمرة. getTransaction (). } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {getSession.closesession (الجلسة) ؛ }} 3. التسامي المقارن
تقوم الطريقتان أيضًا بتنفيذ طريقة رسم خرائط كثيرة ، والنتائج متماثلة ، لكنها مختلفة تمامًا في التنفيذ. سواء كان النوع الأول أو الثاني يستخدم <العديد إلى واحد> لإضافة العلامة إلى ملف التعيين في العديد من الطرف ، وتعيين سمة اسم العلامة إلى قيمة السمة من الطرف الواحد من الفئة المسجلة بواسطة ملف التعيين ، وبالتالي إكمال التعيين الأساسي للعديد إلى واحد ، وهو نفسه. الفرق هو أن علاقة التعيين المباشر لا تستخدم سمات حقل السبات ، وهو أكثر مرونة في التنفيذ. إنه لا يدعم فقط الإضافة والحذف والتعديل ، ولكنه يسمح أيضًا بالاستعلام ؛ يعتمد تعديل سلسلة Cascade الثاني الطريقة التي يوفرها السبات. تدعم هذه الطريقة فقط الإضافة والحذف والتعديل ، ولا تدعم الاستعلام.