1. رسم الخرائط
1. مجموعة مقدمة
يعد تعيين التجميع أيضًا رسمًا أساسيًا ، ولكن لن يتم استخدامه بشكل متكرر أثناء عملية التطوير ، لذلك ليست هناك حاجة إلى فهم عميق. ما عليك سوى فهم أساليب الاستخدام الأساسية. فقط كن قادرًا على الاستعلام عن الحل عندما تواجه مثل هذه المشكلة أثناء عملية التطوير. تعيين مجموعة المقابلة في الواقع ، فهو يشير إلى تعيين المجموعة في جافا إلى الجدول المقابل. إنه رسم خرائط لكائنات التجميع. هناك أربعة أنواع من المجموعات في Java ، وهي مجموعة ، خريطة ، قائمة ومصفوفات عادية. هناك اختلافات كبيرة بينهما:
(1) مجموعة ، يجب ألا يكون هناك أي كائنات مكررة ، يتم اضطراب الكائنات ؛
(2) يمكن طلب القائمة باستخدام كائنات متكررة ؛
(3) خريطة ، تظهر في أزواج من القيم الرئيسية ؛
(4) يمكن تكرار المصفوفات ، وهناك ترتيب بين الكائنات.
يحدد الفرق بينهما المجموعة المستخدمة أثناء التطوير. عادة ، يتم استخدام مجموعة أثناء التطوير. الكائنات الموجودة بداخلها غير ضرورية ويمكن الحصول على الكائنات الداخلية باستخدام مؤلف. إذا كانت هذه المجموعات ترغب في تعيين النموذج العلائقي المقابل ، فيجب عليك استخدام علامات التعيين التي توفرها Hibernate و <stl> و <list> و <map> و <array>.
2. رسم الخرائط مقدمة
استمر في مناقشة نموذج العلاقة لرسم الخرائط. يشير تعيين تعيين إلى كائن يتوافق مع مجموعة كائن آخر. عند حفظها ، ستقوم Hibernate بحفظ مجموعة البيانات إلى الجدول المقابل وحفظ البيانات إلى جدول البيانات وفقًا للمعرف الذي يخصصه. إذا تم تعيين جدول جديد للمجموعة بشكل منفصل ، فسيتم تعيين المعرف إلى معرف الجدول المحدد ، وجدول العلاقة المقابل كما يلي:
3. ملفات الفصل
كيف يتم تنفيذ تعيين تعيين من خلال الكود ، وسنقوم بتحليله بالتفصيل بعد ذلك. هنا نختم جميع المجموعات في الفصل. نحن نسمي هذه الفئة collectionmapping.java ، لذلك فإن الكود الداخلي المقابل هو كما يلي:
حزمة com.hibernate ؛ استيراد java.util.list ؛ استيراد java.util.map ؛ استيراد java.util.set ؛ suppressWarnings ("RawTypes") Collections CollectionMapping {// id private int ؛ public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } // اسم اسم السلسلة الخاصة ؛ السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } // SET COLLECTION SETVALUES ؛ مجموعة عامة getSetValues () {return setValues ؛ } public void setSetValues (setValues) {this.setValues = setValues ؛ } // قائمة مجموعة قائمة قائمة القائمة الخاصة ؛ القائمة العامة getListValues () {return listValues ؛ } public void setListValues (List ListValues) {this.listValues = listValues ؛ } // Array Collection Private String [] ArrayValues ؛ السلسلة العامة [] getArrayValues () {return arrayvalues ؛ } public void setarrayvalues (string [] arrayvalues) {this.arrayValues = arrayvalues ؛ } // مجموعة MAP MAPVALUES الخاصة ؛ الخريطة العامة getMapvalues () {return mapvalues ؛ } public void setMapValues (mapvalues map) {this.mapvalues = mapValues ؛ }}هذه الفئة تغلف العديد من مجموعات شائعة الاستخدام. إذا كنت ترغب في تحويلها إلى نموذج علائقي ، فيجب أن تنظر إلى التعيين أدناه.
4. رسم الخرائط
تعيين مجموعة بسيط في الواقع. تحتاج فقط إلى إضافة علامات التجميع المقابلة. يوفر Hibernate علامات التجميع <tev> و <map> و <list> و <array> على التوالي. يتم تعيين المجموعة في جدول العلاقة المقابلة باستخدام العلامة المركزية. بالإضافة إلى ذلك ، يتم تحقيق ارتباط المفاتيح الأجنبية عن طريق إضافة علامة <Kear> ، ويتم إضافة سمات أخرى باستخدام <element>.
CollectionMapping.hbm.xml
<؟ xml version = "1.0"؟> <! doctype hibernate-mapping public "-// hibernate/hibernate mapping dtd 3.0 // en en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate> <classapping = table = "t_collection_mapping"> <id name = "id"> <generator // id> <property name = "name"/> <set name = "setvalues" table = "t_set_values"> <key column = "set_id"> </key> table = "t_list_values"> <key column = "list_id"/> <list-index column = "list_index"/> <element type = "string" column = "list_value"/> </list> <map name = "mapValues" type = "string" column = "map_value"/> </map> <array name = "arrayValues" table = "t_array_value"> <key column = "array_id"/> <index column = "array_index" type = "integer"> </element type =
تجدر الإشارة إلى أن علامة القائمة وعلامة الصفيف. الكائنات في هاتين المجموعتين في النظام. لذلك ، عند إضافة علامات تعيين ، تحتاج إلى استخدام علامات القائمة أو الفهرس للإشارة إلى ترتيب الكائنات. علاوة على ذلك ، عند إضافة علامات فرعية ، يجب عليك إضافتها بالترتيب. بمعنى ، أضف أولاً علامة <Kear> ، ثم أضف علامة <List-INDEX> ، وأخيراً إضافة علامة <Element> ، وإلا سيظهر الخطأ التالي:
The content of element type "list" must match "(meta*,subselect?,cache?,synchronize*,comment?,key,(index|list-index),(element|one-to-many|many-to-many|composite-element|many-to-any),loader?,sql-insert?,sql-update?,sql-delete?,sql-delete-all?,filter*)".
5. نموذج العلائقية
يتم تحويل نموذج الكائن المكون إلى النموذج العلائقي المقابل ، ويكون عبارة SQL التي تم إنشاؤها هي كما يلي:
تغيير جدول t_array_value إسقاط المفتاح الأجنبي fk2e0dd0c067676b68 تغيير جدول t_list_values إسقاط المفتاح الأجنبي fke01ec98bf4fcb03 arble table t_map_values drop key forear جدول إسقاط إذا كان موجودًا على جدول T_Array_Value إذا كان موجودًا t_collection_mapping جدول إسقاط إذا كان موجودًا t_list_values جدول إسقاط إذا كان هناك t_map_values drop table إذا كان موجودًا t_set_values ، قم بإنشاء جدول t_array_value (array_id integer null ، array_value varchar array_index)) إنشاء جدول T_Collection_Mapping (ID INTEGER NOT NULL AUTO_INCREMENT ، NAME VARCHAR (255) ، المفتاح الأساسي (معرف)) إنشاء جدول T_LIST_VALUE VARCHAR varchar (255) ، map_key varchar (255) not null ، key primar fk2e0dd0c067676b68 مفتاح خارجي (array_id) المراجع t_collection_mapping (معرف) جدول تغيير t_list_values إضافة index fke01ec98bf4fcb03 (list_id) t_map_values إضافة فهرس fkd169ba107402b585 (map_id) ، إضافة القيد fkd169ba107402b585 المفتاح الأجنبي (map_id) المراجع t_collection_mapp FK7BB8D04A7E79F8BF المفتاح الأجنبي (SET_ID) المراجع T_COLLECTION_MAPPE (معرف)
طريقة عرض قاعدة البيانات المقابلة التي تم إنشاؤها على النحو التالي:
2. تشغيل البيانات
1. كتابة البيانات
عند كتابة عمليات البيانات ، تحتاج إلى الانتباه إلى إنشاء كائنات بيانات عند كتابة البيانات. تحتاج قائمة ، وضبطها ، والخريطة إلى إنشاء كائنات بيانات وكتابة كائنات البيانات إلى قاعدة البيانات. نظرًا لأن الثلاثة منهم عبارة عن واجهات كائنات ، فأنت بحاجة إلى إنشاء كائن وكتابة الكائن إلى قاعدة البيانات. الرمز المحدد كما يلي:
suppressWarnings ({"unchecked" ، "RawTypes"}) public void testSave () {Session Session = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ CollectionMapping cm = new CollectionMapping () ؛ CM.SetName ("Zhangsan") ؛ SET SET = NEW HASHSET () ؛ set.add ("a") ؛ set.add ("B") ؛ CM.SetSetValues (set) ؛ قائمة قائمة = ArrayList () جديد ؛ list.add ("list1") ؛ list.add ("list2") ؛ CM.SetListValues (قائمة) ؛ String [] str = new string [] {"Array1" ، "Array2"} ؛ CM.SetArrayValues (STR) ؛ خريطة الخريطة = new hashmap () ؛ map.put ("k1" ، "v1") ؛ map.put ("k2" ، "v2") ؛ CM.SetMapvalues (MAP) ؛ Session.save (cm) ؛ session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}بيان SQL الذي تم إنشاؤه هو كما يلي:
Hibernate: insert في T_Collection_Mapping (الاسم) قيم (؟) hibernate: أدخل في t_set_values (set_id ، set_value) القيم (؟ ،؟) hibernate: insert في t_set_values (set_id ، set_value) (؟ ،؟) hibernate: القيم (؟ ،؟ ،؟) hibernate: insert في t_list_values (list_id ، list_index ، list_value) القيم (؟ ،؟ ،؟) hibernate: insert في t_list_values (list_id ، list_index ، list_value) القيم (؟ ،؟ ،؟) hibernate: (؟ ،؟ ،؟) السبات: أدخل في T_MAP_Values (map_id ، map_key ، map_value) القيم (؟ ،؟ ،؟) hibernate: insert في t_map_values (map_id ، map_key ، map_value) القيم (؟ ،؟ ،؟) hibernate: array_value) القيم (؟ ،؟ ،؟) السبات: إدراج في T_Array_Value (array_id ، array_index ، array_value) قيم (؟ ،؟ ،؟)
2. تحميل البيانات
طريقة تحميل البيانات بسيطة للغاية. سيقوم بتحميل البيانات في الجدول في الكائن وفقًا للمجموعة ، ثم تحتاج فقط إلى الحصول على مجموعة الكائن المقابلة.
public void testload () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ CollectionMapping cm = (CollectionMapping) Session.load (collectionMapping.class ، 1) ؛ System.out.println ("cm.Name ="+cm.getName ()) ؛ System.out.println ("CM.List ="+CM.GetListValues ()) ؛ system.out.println ("cm.Map ="+cm.GetMapValues ()) ؛ System.out.println ("cm.Array ="+cm.GetArrayValues ()) ؛ system.out.println ("cm.set ="+cm.getSetValues ()) ؛ session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ Session.getTransaction (). Rollback () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }}النتيجة الناتجة:
Hibernate: SELECT COLLECTION0_.ID AS ID0_0_ ، COLLECTION0_.NAME AS NAME0_0_ FROM T_COLLECTION_MAPPER COLLECTION0_ أين collection0_.id =؟ Hibernate: حدد arrayvalue0_.array_id as array1_0_ ، arrayvalue0_.array_value as array2_0_ ، arrayvalue0_.array_index as array3_0_ from t_array_value arrayvalue0_ where arrayvalue0_. CM.Name = Zhangsan Hibernate: حدد ListValues0_.List_ID As List1_0_ ، ListValues0_.list_value as list2_0_ ، listValues0_.List_Index as list3_0_ من t_list_values listvalues0_ حيث listValues0_ CM.List = [list1 ، list2] hibernate: حدد mapvalues0_.map_id as map1_0_ ، mapvalues0_.map_value as map2_0_ ، mapvalues0_.map_key as map3_0_ من t_map_values mapvalues0_ where mapvalues0_.map_id =؟ cm.map = {k1 = v1 ، k2 = v2} cm.array = [ljava.lang.string ؛@758d8478 hibernate: Select SETVALUES0_.SET_ID AS SET1_0_ ، setvalues0_.set_value as set2_0_0_0_ cm.set = [b ، a] 3. ملخص
يمكن لـ Hibernate أن تستمر في حالات مجموعات Java التالية ، بما في ذلك java.util.map ، java.util.set ، java.util.sortedmap ، java.util.sortedset ، java.util.list ، ومصفوفات أي كيانات أو قيم ثابتة (باستخدام أنواع المجموعة الأفضل). يمكن أيضًا استمرار خصائص النوع java.util.collection أو java.util.list باستخدام دلالات "الحقيبة". لا يمكن أن تحتفظ المجموعات المستخدمة من أجل الثبات بالدلالات المرتبطة بأي فئات تنفذ هذه الواجهات باستثناء واجهة التجميع (على سبيل المثال: الترتيب التكراري الذي تم تقديمه بواسطة LinkedHashSet). تعمل جميع المجموعات المستمرة فعليًا مباشرة وفقًا لدلالات Hashmap و Hashset و Treemap و Treeset و ArrayList. لوضعها بشكل أعمق ، بالنسبة لخاصية تحتوي على مجموعة ، يجب تعريف نوع Java على أنه واجهة (أي خريطة أو تعيين أو قائمة ، وما إلى ذلك) ، ويجب ألا تكون hashmap أو treeset أو arraylist. السبب في هذا القيد هو أنه عندما لا تعرف ، يحل السبات سراً محل مثيلاتك أو تعيينك وقائمة القائمة بتنفيذها للخريطة أو تعيينها أو قائمةها. (لذلك في البرنامج الخاص بك ، استخدم المشغل == مع تحذير.) (ملاحظة: للأداء وأسباب أخرى ، يتم تنفيذ جميع واجهات مجموعة Java تقريبًا في السبات (لتنفيذ بعض ميزات التحميل كسول). في هذه الحالة ، يكون تحديث فئة المجموعة فعالًا للغاية - تم فهرسة المفتاح الأساسي بفعالية ، لذلك عندما تحاول الإسبات تحديث أو حذف صف ، يمكن العثور على بيانات هذا الصف بسرعة. يتكون المفتاح الأساسي للمجموعة (مجموعات) من <Kear> وحقول العناصر الأخرى. هذا غير فعال بالنسبة لبعض أنواع العناصر ، وخاصة العناصر المركبة أو النص الكبير أو الحقول الثنائية الكبيرة ؛ قد لا تكون قاعدة البيانات قادرة على فهرسة المفاتيح الأولية المعقدة بشكل فعال. من ناحية أخرى ، يمكن أن تحقق مجموعات من نفس الأداء الفعال ، بالنسبة للجمعيات التي يتمتع بها العديد من الجمعيات ، وخاصة المعرفات الاصطناعية ، نفس الأداء الفعال. (الجزء 1: إذا كنت تريد أن تقوم SchemaeSport بإنشاء مفتاح أساسي لـ <stip> ، فيجب عليك إعلان جميع الحقول على أنها غير null = "true". في الواقع ، <idbag> لديه أفضل أداء. الحقيبة هي الأسوأ. نظرًا لأن الحقيبة تتيح قيم العناصر المكررة وليس لها حقول فهرس ، فمن المستحيل تحديد المفاتيح الأولية. لا يمكن لـ Hibernate تحديد خطوط مكررة. عندما يتم تغيير مثل هذه المجموعة ، ستقوم Hibernate أولاً بإزالة المجموعة بالكامل (من خلال حذف واحد) ثم إعادة إنشاء المجموعة بأكملها. لذلك الحقيبة غير فعالة للغاية.