The initial database file required in this article, complete sample code for common Hibernate operations (including all required jar files for Hibernate operations) is provided for download and learning: http://download.csdn.net/detail/daijin888888/9551724
1. رسم خرائط لجمعية السبات
1) ما هو رسم الخرائط؟
إذا كان هناك ارتباط بين الجداول ، فإن السبات يتيح لنا وصف ارتباطهم في HBM.XML ، ثم يعملون تلقائيًا على جدول علاقة آخر وفقًا لهذه العلاقة عندما ندير أحد الجداول. ثم ، تسمى إعدادات علاقة الارتباط هذه رسم خرائط للجمعيات.
2) ما هي فوائد رسم الخرائط؟
يمكن أن ترتبط جداول متعددة بزيارة واحدة
-تتبع بيانات جدول العلاقة
-عودة بيانات جديدة ومعدلة لجداول العلاقة
-حذف بيانات حذف من جدول العلاقة
3) خطوات تنفيذ رسم خرائط الجمعية
- فهم العلاقة بين الجداول وتوضيح حقول العلاقة
-قم بإدخال سمة الارتباط في فئة الكيان لتغليف البيانات المرتبطة
-أنت بحاجة إلى تكوين ملف HBM.XML وتعيين علاقة الارتباط
*2. جمعية واحدة إلى الرجل
مثال: إذا كان لدى الحساب سجلات خدمة متعددة ، فمن المأمول أنه عند الاستعلام عن بيانات الحساب ، فإنه سيستفسر تلقائيًا من بيانات الخدمة المقابلة.
1) علاقة الجدول
علاقة واحدة إلى رواية ، حقل العلاقة هو service.Account_id. (أي ، يجب أن يكون هناك حساب حقل مرتبط بجدول الحساب في جدول الخدمة ، وهذا الحقل يتوافق مع المعرف في جدول الحساب)
2) ملحق سمات العلاقة
في فئة الحساب ، قم بإلحاق خدمات السمات المرتبطة بها ، والتي تم تعيينها <الخدمة>.
مجموعة خاصة <Service> Services = New Hashset <Service> () ؛
3) إعداد العلاقات
-جرمار
اضبط علاقة واحدة إلى حد ما في الحساب. hbm.xml
<set name = "assing attribute name"> <key column = "insistry field name"/> <-to-many/> </st>-emplement <set name = "services"
4) نموذج رمز
معروف:
-خدمات السمة المرتبطة
-Associped Field Account_id
-خدمة كائن Association-> خدمة اسم الجدول
<span style = "font-size: 14px ؛"> public void testfind () {session session = hibernateutil.getSession () ؛ الحساب A = (حساب) جلسة. تحميل (account.class ، 1010) ؛ System.out.println ("--- عرض معلومات حساب ----") ؛ System.out.println (A.GetId () + "" + A.GetRealName () + "" + A.GetIdCardno ()) ؛ System.out.println ("-إظهار حساب الأعمال ضمن الحساب الجاري ----") ؛ SET <Service> Services = A.GetServices () ؛ لـ (Service S: Services) {System.out.println (S.GetId () + "" + S.GetOsUserName () + "" + S.GetUnixhost ()) ؛ } system.out.println (A.ToString ()) ؛ } </span>*3. العديد من الجمعية
مثال: آمل أنه بعد الاستعلام عن بيانات الخدمة ، يمكنني الاستعلام تلقائيًا عن بيانات الحساب المقابلة.
1) العلاقة
الخدمة والحساب لها علاقة كثيرة ، وحقل العلاقة هو service.Account_id
2) إلحاق السمات المرتبطة
-احتمال حساب الخاصية المرتبطة في فئة كيان الخدمة ، نوعه هو حساب.
حساب الحساب الخاص ؛
بعد ذلك ، يمكن إزالة السمة الحسابية ، ويمكن الحصول على قيمة account_id من خلال طريقة getAccount (). getID ()
3) إعداد العلاقات
أ. بناء الجملة:
-في الخدمة. hbm.xml ، أضف تكوين علاقة الارتباط
-<العديد من الاسم إلى واحد = "اسم سمة الارتباط"
العمود = "اسم الحقل العلائقي"
/>
ب. تطبيق:
<العديد من الاسم = "الحساب"
العمود = "account_id"
/>
4) نموذج رمز
معروف:
-حساب خاصية Association
-Associped Field Account_id
-حساب-> حساب اسم الجدول ، معرف المفتاح الأساسي
<span style = "font-size: 14px ؛"> public void testfind () {session session = hibernateutil.getSession () ؛ SERVICE S = (SERVICE) SETATE.get (service.class ، 2002) ؛ System.out.println ("---- إظهار معلومات حساب الأعمال ----") ؛ System.out.println (S.GetId () + "" + S.GetOsuserName () + "" + S.GetUnixhost ()) ؛ System.out.println ("--- عرض معلومات الحساب ذات الصلة ---") ؛ System.out.println (S.GetAccount (). getId () + "" + S.GetAccount (). getRealName ()) ؛ } </span>*4. العمليات ذات الصلة
1) الاستعلام ذات الصلة
إذا كنت بحاجة إلى استخدام عبارة SQL لتشكيل الكائن الحالي والسمة المرتبطة بها ، فيمكنك استخدام الطريقة التالية:
أ. (غير موصى به) تعديل تعيين السمة المرتبطة في hbm.xml
السمة الكسول:
صحيح يعني أن التحميل كسول ممكّن ؛
خطأ يعني إغلاق التحميل كسول
سمة الجلب:
الانضمام يعني أنه يتم استخدام طريقة الاتصال للاستعلام مع الكائن الرئيسي. في هذا الوقت ، lazy = "false" غير صالح ؛
حدد (افتراضي) يعني إرسال البيانات المرتبطة باستعلام SQL بشكل منفصل
ب. (موصى به) تمرير HQL وانضم
-من حساب انضمام جلب A.Services حيث A.ID =؟
المعنى: عند الاستعلام عن كائن الحساب ، يتم العثور على بيانات السمة المرتبطة بالخدمات معًا باستخدام اتصال الجدول.
-من الخدمة s الانضمام جلب S.Account حيث s.id =؟
المعنى: عند الاستعلام عن كائنات الخدمة ، يتم العثور على بيانات السمة المرتبطة بالحساب معًا باستخدام اتصال الجدول.
-من الخدمة s الانضمام جلب S.Account حيث s.Account.id =؟
يلاحظ:
- الكائنات والخصائص مكتوبة في HQL
-الانضمام إلى الجلب لا يوجد على شرط بعد ذلك ، ويترافق الجلب من السمة المرتبطة
-query.setInteger لتعيين قيمة المعلمة Integer ، ويبدأ الترتيب من 0.
-إذا كان من الواضح أن HQL ستعيد سجلًا واحدًا فقط ، فيمكنك استخدام طريقة Query.Uniqueresult () لإرجاع سجل فريد
ج. نموذج رمز (أعد كتابة رمز استعلام جمعية أحادي إلى حد كبير)
<span style = "font-size: 14px ؛"> public void testfind () {session session = hibernateutil.getSession () ؛ // الحساب A = (حساب) جلسة. تحميل (account.class ، 1010) ؛ String HQL = "From Account a join join a.services where A.ID =؟" ؛ استعلام Query = Session.Createquery (HQL) ؛ Query.SetInteger (0 ، 1010) ؛ //؟ ابدأ من 0 حساب A = (حساب) Query.Uniqueresult () ؛ // يمكن أن يستخدم الاستعلام الفردي system.out.println ("--- عرض معلومات الحساب ----") ؛ System.out.println (A.GetId () + "" + A.GetRealName () + "" + A.GetIdCardno ()) ؛ System.out.println ("--- عرض حساب الأعمال ضمن الحساب الجاري ----") ؛ SET <Service> Services = A.GetServices () ؛ لـ (Service S: Services) {System.out.println (S.GetId () + "" + S.GetOsUserName () + "" + S.GetUnixhost ()) ؛ } system.out.println (A.ToString ()) ؛ } </span> 2) إضافة متتالية وتعديل متتالي
أ. عندما يكون للجدول علاقة ارتباط ، لا يوفر السبات وظيفة استعلام الارتباط فحسب ، بل يتمتع أيضًا بالقدرة على إضافة البيانات وتعديلها وحذفها في جدول الجمعية. وتسمى هذه القدرة عملية متتالية.
ب. كيفية تنفيذ عمليات متتالية
تحتاج إلى إضافة سلسلة السمة في الموقع حيث يتم تعيين السمة المرتبطة.
-لا أحد: التتابع غير مدعوم افتراضيًا
-التحديث: يدعم الإضافة والتحديث المتتالي
-الحذف: يدعم الحذف المتتالي
-كل: يدعم الإضافة المتتالية والتحديث والحذف
ج. وصف
عادة ، هناك علاقة جدول 1 إلى عدد. جانب واحد من 1 هو الجدول الرئيسي والجانب الآخر من 1 هو جدول الرقيق. غالبًا ما يكون من الضروري إضافة بيانات جدول الرقيق وتحديثها وحذفها عند إضافة وتحديث وحذف الجدول الرئيسي. على سبيل المثال: عند حذف حساب ، يجب عليك حذف بيانات حساب الأعمال معًا.
3) حذف سلسلة
أ. تعيين Cascade = "Delete" أو Cascade = "All" لدعم حذف Cascade
ب. بشكل عام ، من الضروري إضافة السمة العكسية = "true" في علامة تعيين 1.
ج. Session.Delete (OBJ) ؛ يجب أن يكون OBJ كائنًا ثابتًا ، ولا يمكن أن يكون جديدًا ، ويجب أن يتم تحميله/الحصول عليه.
د. طرق لحذف الدُفعات:
يستخدم Cascading Delete بيانات حذف N+1 لمسح البيانات المرتبطة بها للجدول الرئيسي وجدول المفاتيح الخارجية.
إذا كان حذف الدُفعات ، فلا ينصح بالحذف المتتالي. يوصى باستخدام HQL لكتابة عبارات حذف الحذف .
حذف من الخدمة أين الحساب. في جدول الخدمة ، (تحل هذه الجملة محل بيانات حذف في عملية متتالية)
حذف من الحساب أين المعرف =؟
4) العكسية السمة (الفهم) التفاصيل هنا
سواء لتسليم السيطرة على صيانة العلاقة. وهذا ، بشكل افتراضي ، يتم الحفاظ على العلاقة بين الحساب وكائنات الخدمة من قبل كلا الطرفين. وهذا يعني أنه عند القيام بعمليات متتالية على كائنات الحساب أو الخدمة ، تحتاج إلى تنفيذ عبارة تحديث لتعيين الحقل المرتبط بنفس المعرف. إذا كنت بحاجة إلى إلغاء أعمال صيانة العلاقة بين طرف معين ، فيمكنك إضافة إعداد عكسي = "حقيقي" إلى قسم السمات المرتبطة ، والذي يمكنه تجنب تنفيذ عبارة التحديث.
صحيح: تسليم السيطرة ، الكائن الحالي غير مسؤول عن الحفاظ على العلاقة بين الجدولين
خطأ: لم يتم تسليم التحكم ، يجب أن يكون الكائن الحالي مسؤولاً عن الحفاظ على العلاقة بين الجدولين
نصيحة: غالبًا ما يتم ضبطه على عكسي = "صحيح" لطرف واحد (على سبيل المثال ، الجزء <-to-many> رسم الخرائط) على عكس = "true" ، بحيث يمكن تجنب عدد كبير من عبارات التحديث عند إجراء عمليات متتالية على طرف واحد.
*5. جمعية كثيرة إلى الرجل
مثال: admin admin_info و rol _info لها علاقة كثيرة. آمل أنه عند الاستعلام عن المسؤول ، يمكنه الاستعلام عن دوره المقابل. عند تصميم قاعدة بيانات ، من الضروري استخدام 3 جداول لتمثيلها.
admin_info (مسؤول)
admin_role (علاقة المشرف والدور)
دور (دور)
1) حقول العلاقة
تقع حقول العلاقة في الجدول الوسيط admin_role ،
admin_id = admin_info.id
rob_id = rob_info.id
2) إلحاق السمات المرتبطة بإلحاق السمات المتعلقة بالدوار لفئة كيان المسؤول
تعيين <ROB> الأدوار
3) إلحاق تكوين رسم خرائط الارتباط في admin.hbm.xml
--Syntax <set name = "اسم السمة Assistrict" table = "اسم الجدول الأوسط"> <مفتاح العمود = "اسم الحقل المرتبط بالمسؤول"/> <to-to-many column = "اسم الحقل المرتبط بالمسؤول"/> </set>-code <set name = "roles" table = "admin_role"
4) عملية التتالي
تعني Cascade أن عمليات التتالي مدعومة ، ويعمل الجدول على الجانب الآخر ، بدلاً من تمثيل جدول عمليات التتالي الوسيط. للحفاظ على الجداول الوسيطة ، ليست هناك حاجة لكتابة سمة Cascade.
5) عكسية
بشكل عام ، لا تحتاج العديد من العلاقات إلى كتابة العكسي = "صحيح". والسبب هو أنه عندما يقوم الطرف الآخر بإدراج البيانات ، قد لا يكون لديه البيانات في الجدول الوسيط ، ويحتاج الطرف الحالي إلى الحفاظ عليها. لذلك ، لا يمكن كتابة عكس = "صحيح". خلاف ذلك ، لا يحافظ أي من الطرفين على هذه العلاقة وهناك مشاكل في البيانات.
6) نموذج رمز جافا
<span style = "font-size: 14px ؛"> // قم بإزالة دور testDeletRole () testDeleTRole () المعاملة tx = session.begintransaction () ؛ حاول {admin a = (admin) session.load (admin.class ، 1) ؛ الدور R1 = (دور) session.load (rol.class ، 1) ؛ A.GetRoles (). إزالة (R1) ؛ session.update (a) ؛ tx.Commit () ؛ } catch (hibernateException e) {e.printStackTrace () ؛ tx.rollback () ؛ } أخيرًا {session.close () ؛ }} // espend or stest public void testaddrole () {session session = hibernateutil.getSession () ؛ المعاملة tx = session.begintransaction () ؛ حاول {admin a = (admin) session.load (admin.class ، 1) ؛ الدور R1 = (دور) session.load (rol.class ، 1) ؛ الدور R2 = (دور) session.load (rol.class ، 43) ؛ الدور R3 = (دور) session.load (rol.class ، 44) ؛ A.GetRoles (). ADD (R1) ؛ A.GetRoles (). ADD (R2) ؛ A.GetRoles (). ADD (R3) ؛ session.update (a) ؛ tx.Commit () ؛ } catch (hibernateException e) {e.printStackTrace () ؛ tx.rollback () ؛ } أخيرًا {session.close () ؛ } }Test public void testfind () {session session = hibernateutil.getSession () ؛ المعاملة tx = session.begintransaction () ؛ حاول {admin a = (admin) session.load (admin.class ، 1) ؛ system.out.println ("----- عرض معلومات المسؤول ----") ؛ System.out.println (A.GetId () + "" + A.GetName () + "" + A.GetTelePhone ()) ؛ System.out.println ("----- إظهار معلومات دور المسؤول ---") ؛ لـ (دور الدور: a.getRoles ()) {system.out.println (rob.getName () + "") ؛ } tx.commit () ؛ } catch (hibernateException e) {e.printStackTrace () ؛ tx.rollback () ؛ } أخيرًا {session.close () ؛ }} </span>6. جمعية الميراث
مثال: ابحث عن المنتجات على مواقع التجارة الإلكترونية ، مثل إدخال iPhone للبحث. يمكن أن تتضمن نتائج البحث معلومات المنتج المتعلقة بالهواتف المحمولة وأفلام الهواتف المحمولة وحالات الهاتف المحمول والشحن وسماعات الرأس وما إلى ذلك. يمكن التعبير عن هذه الوظيفة من خلال علاقة خاصة بمفردها عند تصميم الجداول. أي أن السمات الشائعة لجميع المنتجات يتم استخراجها في منتج جدول مشترك. يتم تخزين جدول المنتج المحدد فقط في جدول المنتج المحدد ، وبالتالي فإن جدول المنتج المحدد وجدول المنتج لهما علاقة فردية. عند البحث ، يمكنك البحث فقط عن جدول المنتج ، ويمكنك البحث عن المعلومات ذات الصلة.
-منتج جدول المعلومات العام (المعرف ، الاسم ، السعر ، DESC)
-كتاب قائمة المنتجات (ID ، Authod ، Publishing ، Words)
-آمل أنه عند تشغيل جدول الكتب ، يمكنني تلقائيًا الحفاظ على الحقول الشائعة في جدول المنتج.
1) علاقة واضحة
الكتب والمنتج لها علاقة فردية. الغرض من هذه العلاقة هو إعادة استخدام الحقول في جدول المنتج ، مثل علاقة الميراث.
2) فئة الكيان
الكتاب يمتد المنتج
3) تنعكس العلاقات ذات الصلة في ملفات التكوين
-نوع الوالدين يتوافق مع طريقة كتابة ملفات التكوين الأصلية
-الأنواع ذات الخصائص الخاصة
<joined-subclass name = "type name" table = "table name" تمديد = "اسم الفئة الأصل"> <مفتاح العمود = "اسم حقل الارتباط"/> <property name = "" type = "" "column =" "/> ...
4) في علاقة الميراث ، نظرًا لأن الجدولين لهما علاقة مماثلة لعلاقة الوالدين والطفل ، يجب الرجوع إلى البيانات في الجدول الأصل في جدول الطفل. لا توجد حالة من غير المرجع ، أي يجب الحفاظ على الجدول الأصل أثناء الحفاظ على طاولة الطفل. لذلك هذا موقف ثابت ، لذلك لا تحتاج إلى كتابة سلسلة أو عكسية.
5) فئة الوصف (فهم)
<loined-subclass> قاعدة البيانات بها جدول فئة أولياء
<Union-subclass> تحتوي قاعدة البيانات على جدول فئة فرعية ولا يوجد جدول فئة من فئة الأصل (يحتوي جدول الفئة الفرعية بالفعل على حقل جدول الفئة الأصل ، لا يوجد جدول فئة من الوالدين ، ولكن لديه كائن كيان فئة الوالدين)
<creccass> تحتوي قاعدة البيانات على فئة أولياء أمور فئة وطفل وتستخدم جدولًا (التصميم فوضوي ، أي أنه لا يوجد تقسيم الجدول ، ونادراً ما يتم استخدامه)
*7. استعلام السبات
1) *استعلام HQL (لغة الاستعلام السباتية)
إنه ينتمي إلى بيان استعلام موجه نحو الكائن ، ويستعل عن Pojo تم تعيينه بواسطة Hibernate ، وبالتالي تحقيق الاستعلام عن قاعدة البيانات.
أ. استخدم المفتاح غير الابتدائي لإجراء استعلام مشروط
-المعلمات الشرطية ل؟ يشير إلى أن Query.SetString (0 ، "") ؛
-يتم تمثيل المعلمات الشرطية بواسطة: X ، Query.SetString ("X" ، "") ؛
نموذج الرمز:
<span style = "font-size: 14px ؛"> // test للاستعلام المشروط بواسطة مفتاح غير مبدئي testfiND1 () {String hql = "from service account.id =؟ و unixhost =؟" ؛ جلسة الجلسة = hibernateutil.getSession () ؛ استعلام Query = Session.Createquery (HQL) ؛ Query.SetInteger (0 ، 1011) ؛ Query.SetString (1 ، "192.168.0.23") ؛ قائمة <Service> list = query.list () ؛ for (service s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getUnixhost ()) ؛ } session.close () ؛ } // مكافئ لـ testFind1 ، باستخدام ": identifier" بدلاً من test public void testfind2 () {string hql = "from service where account.id =: Aid and Unixhost =: host" ؛ جلسة الجلسة = hibernateutil.getSession () ؛ استعلام Query = Session.Createquery (HQL) ؛ Query.SetInteger ("Aid" ، 1011) ؛ Query.SetString ("Host" ، "192.168.0.23") ؛ قائمة <Service> list = query.list () ؛ for (service s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getUnixhost ()) ؛ } session.close () ؛ } </span> ب. فقط الاستعلام عن بعض السمات
-المجموعة الافتراضية التي تم إرجاعها مغلفة هي كائن []
-خدمة جديدة (ID ، Unixhost ، OsuserName) تغلف كائن الخدمة في المجموعة التي تم إرجاعها.
يلاحظ:
مُنشئ يحتاج إلى إلحاق استجابة في الخدمة ؛
لا ترمي بعيدًا عن مُنشئ المعلمة.
نموذج الرمز:
<span style = "font-size: 14px ؛"> // احصل على بعض نتائج الحقل ، واستخدم الكائن [] لتغليف البيانات بشكل افتراضي testfind3 () جلسة الجلسة = hibernateutil.getSession () ؛ استعلام Query = Session.Createquery (HQL) ؛ Query.SetInteger (0 ، 1011) ؛ قائمة <Object []> list = query.list () ؛ لـ (Object [] objs: list) {system.out.println (objs [0] + "" + objs [1] + "" + objs [2] + "") ؛ } session.close () ؛ } // مكافئ لـ testFind3 ، تحتاج إلى إضافة المُنشئ المقابل testfind4 () {string hql = "Select Service New Service (S.ID ، S.Unixhost ، S.OsuserName) من S.Account.id =؟" ؛ جلسة الجلسة = hibernateutil.getSession () ؛ استعلام Query = Session.Createquery (HQL) ؛ Query.SetInteger (0 ، 1011) ؛ قائمة <Service> list = query.list () ؛ for (service s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getUnixhost ()) ؛ } session.close () ؛ } </span> ج. تعريف HQL في ملف التكوين (فقط فهم)
-تعريف HQL في ملف التكوين من خلال عنصر الاستعلام
-عنصر Query مكتوب وراء الفصل
-SESSET.GETNAMEDQUERY (اسم HQL) ؛
رمز نموذج: <query/> و <class/> يتم وضعه في hbm.xml في نفس المستوى
<span style = "font-size: 14px ؛"> <query name = "findall"> <!-قم بتضمين حقول نصية عادي في CDATA لمنع الأحرف الخاصة-> <! testfind5 () {جلسة الجلسة = hibernateutil.getSession () ؛ // احصل على عبارة HQL محددة في <Query> في استعلام HBM.XML Query = Session.getNamedQuery ("Findall") ؛ قائمة <Service> list = query.list () ؛ for (service s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getUnixhost ()) ؛ } session.close () ؛ } </span> د. استعلام ترقيم الصفحات
-سجلات QUERY
Query.SetFirStresult ((صفحة 1)*pagesize) ؛
Query.SetMaxResults (pagesize) ؛
-إجمالي عدد الصفحات
حدد العد (*) من الخدمة
نموذج الرمز:
<span style = "font-size: 14px ؛"> // اختبار Query QueryTest public void testfind6 () {int page = 2 ؛ String HQL = "From Service Order by id" ؛ جلسة الجلسة = hibernateutil.getSession () ؛ استعلام Query = Session.Createquery (HQL) ؛ // إضافة معلمات الترحيل لتعيين query.setFirStresult ((الصفحة - 1) * 3) ؛ // قم بتعيين نقطة البداية للاستيلاء على السجلات ، بدءًا من 0 query.setMaxResults (3) ؛ // قم بتعيين الحد الأقصى لعدد القائمة من القائمة (Service> list = query.list () System.out.println (S.GetId () + "" + S.GetOsuserName () + "" + S.GetUnixhost ()) ؛ } session.close () ؛ }. جلسة الجلسة = hibernateutil.getSession () ؛ استعلام Query = Session.Createquery (HQL) ؛ حجم طويل = (طويل) Query.UniquerEsult () ؛ System.out.println ("إجمالي عدد السجلات:" + حجم) ؛ session.close () ؛ } </span> ه. استعلام ذات صلة (فقط تذكر واحد)
-من الخدمة s ، الحساب أ
حيث S.Account.id = A.ID
-من الخدمة الداخلية للانضمام إلى S.Account
-SELECT S.Account.RealName من الخدمة S
تلخيص:
أوجه التشابه بين HQL و SQL :
-الدعم المختار ، من ، حيث ، المجموعة ، ترتيب بالتربية
-الدعم الداخلي للانضمام والانضمام اليسرى والاتصالات الأخرى
--Suport> ، <،> = ، <= ، in ، وليس في ، بين ، مثل الشروط وغيرها
-وظائف إحصائيات التجميع الداعمة
الاختلافات بين HQL و SQL :
-عبارات HQL حساسة للحالة ، أي حساسة للحالة. الكلمات الرئيسية لا يمكن تمييزها.
-HQL يكتب أسماء الكائنات وأسماء السمات ، وليس أسماء الجدول وأسماء الحقول
-لا يتم دعم الشرط في الانضمام إلى
-SELECT غير مدعوم *
-وظائف المجال غير مدعومة ، مثل دالة التاريخ to_date () ، وظيفة الأحرف to_char () ، إلخ.
2) استعلام المعايير (غير بديهي بما فيه الكفاية ، فقط فهم)
استخدم API Hibernate لتهجئة HQL
المعايير c = session.createcriteria (service.class) ؛
نموذج الرمز:
<span style = "font-size: 14px ؛"> // استخدم واجهة برمجة تطبيقات Hibernate لتهجئة HQLTest public void testfind1 () {جلسة الجلسة = hibernateutil.getSentessed () ؛ المعايير c = session.createcriteria (service.class) ؛ C.Add (القيود إلحاق الفرز // for (service s: list) {system.out.println (s.getId () + "" + s.getosuserName () + "" + s.getUnixhost ()) ؛ } session.close () ؛ } </span> 3) استعلام SQL
ساعدنا بشكل مباشر في الاتصال بـ JDBC لتنفيذ استعلامات SQL
sqlquery sqlquery = session.createsqlquery (sql) ؛
نموذج الرمز:
<span style = "font-size: 14px ؛"> test public void testfind1 () {string sql = "select * from service" ؛ جلسة الجلسة = hibernateutil.getSession () ؛ sqlquery sqlquery = session.createsqlquery (sql) ؛ sqlquery.setfirstresult (0) ؛ // pagination sqlquery.setMaxResults (3) ؛ // بشكل افتراضي ، يتم استخدام صفيف لتغليف قائمة سجلات <Object []> rip = sqlquery.list () ؛ لـ (Object [] objs: list) {system.out.println (objs [0] + "" + objs [2]) ؛ } session.close () ؛ } // نفس TestFind1 () ، حدد الكيان الذي يلفت سجل @test public void testfind2 () {String sql = "select * from service" ؛ جلسة الجلسة = hibernateutil.getSession () ؛ sqlquery sqlquery = session.createsqlquery (sql) ؛ sqlquery.setfirstresult (0) ؛ // pagination sqlquery.setMaxResults (3) ؛ // حدد فئة الكيان التي تغلف السجل sqlquery.addentity (service.class) ؛ // تغلف سجلًا مع قائمة نوع الخدمة المحددة <Rucment> list = sqlquery.list () ؛ for (service s: list) {system.out.println (s.getId () + "" + s.getosuserName ()) ؛ } session.close () ؛ } </span>8. السباتات المتقدمة (الفهم)
1) ذاكرة التخزين المؤقت المستوى 2
أ. ذاكرة التخزين المؤقت من المستوى 2 (افتراضي)
-ذاكرة التخزين المؤقت من المستوى الثاني هي ذاكرة التخزين المؤقت على مستوى الجلسة ، والتي تديرها SessionFactory
-الكائن المخبوق هو أيضًا كائن كيان
-يمكن مشاركة البيانات المغطاة بين الجلسات المختلفة
-بيئة قابلة للتطبيق: بيانات الكائن المشتركة بشكل متكرر ؛ تردد صغير لتغيير بيانات الكائن
ب. خطوات لاستخدام ذاكرة التخزين المؤقت المستوى 2
-حزمة ذاكرة التخزين المؤقت ehcache.jar
-import Cache Configuration File ehcache.xml
-في hibernate.cfg.xml ، تعيين لتمكين ذاكرة التخزين المؤقت الثانوية وتعيين فئة برنامج تشغيل ذاكرة التخزين المؤقت
<span style = "font-size: 14px ؛"> <!-باستخدام المستوى 2 ذاكرة التخزين المؤقت-> <name name = "hibernate.cache.use_second_level_cache"> true </property> <!-حدد فئة برنامج التشغيل Ehcache.jar-> <property name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </property> </span>
-حدد العنصر في ملف التعيين العلائقي hbm.xml من pojo ليتم تخزينه مؤقتًا <cache use = "readonly"/>
نموذج الرمز:
<span style = "font-size: 14px ؛"> <span style = "font-size: 14px ؛"> test public void testfind1 () {// للاستعلام الأول ، استخدم جلسة الجلسة 1 = hibernateutil.getsession () ؛ SERVICE S1 = (SERVICE) SETATE1.GET (SERVICE.CLASS ، 2002) ؛ System.out.println (s1.getosuserName () + "" + s1.getUnixhost ()) ؛ الجلسة 1.Close () ؛ // يستخدم الاستعلام الثاني Session2 (بعد تكوين ذاكرة التخزين المؤقت الثانوية ، ينتقل كلا الاستعلامات إلى ذاكرة التخزين المؤقت الثانوية لجلب البيانات) // hibernateutil.getsessionfactory (). Exfict (service.class) ؛ // بعد الإزالة ، لا تزال تستفسر مرتين. جلسة 2 = hibernateutil.getSession () ؛ الخدمة S2 = (الخدمة) Session2.get (service.class ، 2002) ؛ System.out.println (s2.getosuserName () + "" + s2.GetUnixhost ()) ؛ } </span> </span> 2) ذاكرة التخزين المؤقت الاستعلام
أ. ذاكرة التخزين المؤقت الاستعلام
يمكن لخزائن التخزين المؤقت من المستوى 1 والمستوى 2 ذاكرة التخزين المؤقت فقط. إذا واجهت نتيجة سلسلة أو نتيجة صفيف أو مجموعة قائمة ، فيمكنك استخدام تخزين ذاكرة التخزين المؤقت للاستعلام.
-يمكن اعتبارها ذاكرة التخزين المؤقت الخاصة من المستوى 2
-مساحة ذاكرة التخزين المؤقت المستخدمة هي ذاكرة التخزين المؤقت للمستوى الثاني
-ذاكرة التخزين المؤقت هي نوع البيانات بخلاف كائن الكيان
-احتجاز على ذاكرة التخزين المؤقت من المستوى 2 ، يتم إيقاف تشغيله افتراضيًا ، ويجب تشغيل ذاكرة التخزين المؤقت من المستوى 2 قبل استخدامها.
ب. استخدم الخطوات
-Open Level 2 Cache
-اختيار ذاكرة التخزين المؤقت للاستعلام المفتوح في hibernate.cfg.xml
<span style = "font-size: 14px ؛"> <!-قم بتشغيل ذاكرة التخزين المؤقت للاستعلام-> <property name = "hibernate.cache.use_query_cache"> true </splense> </span>
قبل الاستعلام -query.list () ، query.setCachable (true) ؛
ج. بيئة الاستخدام
-نفس بيان الاستعلام الذي يجب تنفيذه بشكل متكرر
-تغييرات نتائج الاستعلام تتغير في تكرار التردد
-لا يوجد الكثير من البيانات في مجموعة النتائج. نصيحة: لنفس SQL ، انتقل إلى قاعدة البيانات لأول مرة للاستعلام ، والخروج من ذاكرة التخزين المؤقت عدة مرات في المستقبل. لأن محتوى مجموعة النتائج SQL+
نموذج الرمز:
<span style = "font-size: 14px ؛"> <span style = "font-size: 14px ؛"> test public void testfind () {find () ؛ System.out.println ("-------") ؛ يجد()؛ } private void find () {String hql = "from service where account.id =؟" ؛ جلسة الجلسة = hibernateutil.getSession () ؛ استعلام Query = Session.Createquery (HQL) ؛ Query.SetInteger (0 ، 1011) ؛ // تمكين استعلام تنفيذ ذاكرة التخزين المؤقت الاستعلام. قائمة <Service> list = query.list () ؛ for (service s: list) {system.out.println (s.getId () + "" + s.getosuserName ()) ؛ }} </span> </span>9. سباتي قفل المعالجة المتزامنة
على سبيل المثال:
محاكاة آلية شراء التذاكر 12306 ، على افتراض أن هناك حاليًا تذكرة تذكرة (معرف ، خط ، مبلغ ، إصدار) من تذاكر القطار ، ومحاكاة السيناريو الذي يشتري فيه العديد من الأشخاص تذاكر في نفس الوقت.
1) قفل متشائم
-البرنامج متشائم من أن كل زائر لديه مشكلة تزامن ، لذلك سيتم قفل كل جزء من البيانات. ثم ، فقط عندما يقوم الزائر الحالي الذي يحمل القفل بإطلاق القفل ، يمكن للزائر التالي الوصول إلى البيانات. وتسمى هذه الآلية قفل متشائم.
-وهذا هو ، يجب عليك قفل البيانات بغض النظر عن السبب ، بغض النظر عما إذا كانت البيانات سيكون لها تزامن.
--سمات
كفاءة منخفضة وسلامة عالية
--ينجز:
الحصول على (الفصل ، معرف ، lockmode.upgrade)
حدد * من EMP for Update
ملاحظة: هنا نستخدم جملة FOR UPDATE التي تأتي مع قاعدة البيانات الخاصة بالقفل ، وليس آلية القفل التي اخترعها Hibernate نفسها.
2) قفل متفائل
-البرنامج متفائل بأن كل زائر لن يعاني من مشاكل متزامنة ، لذلك لا يضيف أقفال. بدلاً من ذلك ، عند تحديث البيانات ، يتم تحديد ما إذا كان إصدار البيانات قد تغير. إذا تغير ، فهذا يعني أن هناك حدوث متزامن خلال هذه الفترة. لذلك ، تم الإبلاغ عن خطأ وفشل التحديث.
-مع مساعدة حقل الإصدار ، عندما يقوم المستخدم الأول بتحديث ومرسى ، ستقوم Hibernate بتحديث الحقل بمقدار 1 ، بحيث يكون حقل إصدار الكائن المقدم من المستخدم اللاحق أصغر من ذلك في قاعدة البيانات ، أي عندما يتم العثور على الإصدار للتغيير أثناء التحديث ، سيتم إلقاء استثناء وسوف يفشل التحديث.
-نجاح واحد ، فشل آخرون
--سمات
كفاءة عالية ، خبرة المستخدمة الفقيرة
--ينجز
أ. تحتاج إلى إلحاق حقل الإصدار إلى الجدول لتسجيل إصدار البيانات ؛
ب. إلحاق سمات الإصدار إلى فئة الكيان ؛
ج. تكوين الإصدار الإضافي في hbm.xml <version name = "" type = "" "column =" "
3) كيفية الاختيار
-إذا كان التزامن كبيرًا ، فيجب اختيار قفل التفاؤل
-إذا كان التزامن صغيرًا ، فيجب عليك اختيار قفل متشائم
ما سبق هو التحليل الشامل للعمليات المتعلقة بالإسبات وعمليات الاستعلام والميزات المتقدمة وآلية معالجة التزامن التي أدخلها المحرر لك. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فالرجاء ترك رسالة لي وسوف يرد المحرر لك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!