1. دورة حياة الكائن المستمر
بعد أن يستخدم التطبيق إطار عمل السبات ، ستخوض الكائنات المستمرة التي أنشأها التطبيق مجموعة كاملة من دورات الحياة لإكمال عمليات قاعدة البيانات ، والتي من بينها الحالات الرئيسية الثلاث عابرة ، ومثابرة ، وفصلها. يمكن التحكم في تحولات هذه الحالات الثلاث في التطبيق ، كما هو موضح في الشكل أدناه:
من أجل فهم هذه الحالات بوضوح ، إليك مثال لعرض الاختلافات بين الكائنات في هذه الحالات. الرموز التالية في الولايات هي كما يلي:
(1) إنشاء مجموعة hibernate_session وأضف حزمة جرة مقابلة ؛
(2) تكوين السبات ، وأضف فئة مستخدم الكيان المقابلة ، وملفات التعيين الخاصة به ، وتكوين اتصال قاعدة البيانات المقابلة ؛
ملف تعريف ملف فئة المستخدم user.hbm.xml رمز:
<؟ -> <hibernate mapping> <class name = "com.hibernate.user"> <name = "id"> <generator/> </id> <property name = "name"/> <property name = "password"/> <property name = "createTime"/>
رمز تكوين اتصال قاعدة بيانات قاعدة البيانات:
<؟ <Session-factory> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <property name = "hibernate.connection.url"> jdbc: mysql: // localhost: 3306/hibernate_session </propert <property name = "hibernate.connection.password"> ab12 </property> <!-لهجة: لهجة ، واجهة برمجة التطبيقات الأساسية المغطاة ، على غرار وقت التشغيل ، يحول قاعدة البيانات إلى اللغة المقابلة في التكوين-> <property name = "hibernate.dialect" Resource = "com/hibernate/user.hbm.xml"/> </session-factory> </hibernate-configuration>
(3) إضافة فئة عامة من SessionFactory SessionFactory الثابت لإنشاء SessionFactory وكائن الجلسة الخاص بها ؛
حزمة com.hibernate ؛ استيراد org.hibernate.session ؛ استيراد org.hibernate.SessionFactory ؛ استيراد org.hibernate.cfg.configuration ؛ جلسة الطبقة العامة {Private Static SessionFactory Factory ؛ // إعلان ثابت SessionFactory المحلي ، مرآة قاعدة بيانات ثابت {try {// إنشاء ملف التكوين واحصل عليه لقاعدة بيانات التكوين ، والحصول على hibernate.cfg.xml التكوين cfg = جديد التكوين (). التكوين () ؛ المصنع = cfg.buildSessionFactory () ؛ // إنشاء صورة قاعدة بيانات} catch (استثناء e) {E.PrintStackTrace () ؛ // Print Error Message}} GetSession GetSession () {return factory.opensession () ؛ // إرجاع كائن الجلسة الذي تم إنشاؤه} sessionfactory getSessionFactory () {Return Factory ؛ // إرجاع sessionfactory المقابلة} // أغلق كائن الجلسة الفراغ الثابت الثابت (جلسة الجلسة) {if (session! = null) {if (session.isopen ()) {session.close () ؛ }}}}}(4) أضف مجلد مصدر ، وأضف حزمة تسمى com.hibernate في المجلد ، وأضف ملف فئة باسم SessionTest إلى الحزمة.
حزمة com.hibernate ؛ استيراد java.util.date ؛ استيراد junit.framework.testcase ؛ استيراد org.hibernate.session ؛ استيراد org.hibernate.transaction ؛ يمتد SessionTest للفئة العامة TestCase {} 2. طريقة تحويل الدولة
1. الكائن يدخل مباشرة إلى الحالة المستمرة
1.1 احصل على الطريقة
احصل على صف من المعلومات من قاعدة البيانات وقم بمزامنة المعلومات في الكائن الذي تم إنشاؤه. تقوم هذه الطريقة بإرجاع كائن كائن وإرجاع NULL إذا لم يتم العثور على محتوى. يستخدم المثال التالي طريقة الحصول على الجلسة للحصول على كائن وتحويل الكائن إلى مثيل.
public void testget1 () {جلسة الجلسة = null ؛ المعاملة tx = فارغة ؛ جرب {session = hibernateutils.getSession () ؛ // Open Transaction tx = session.begintransaction () ؛ . System.out.println (user.getName ()) ؛ // الحالة المستمرة // كائن مع تغييرات الحالة المستمرة عندما تتغير خصائص الكائن // ستراجع kibernate user.setName ("Zhao Liu") ؛ session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ if (tx! = null) {tx.rollback () ؛ }} أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} اضبط نقاط التوقف للحصول على كائن المستخدم.
يتم الحصول على هذا الكائن ويتم الحصول على كائن المستخدم بعد الصب. تتم إضافة طريقة setName إلى البرنامج ، مما يعني أنه سيتم تحديث الاسم الموجود في قاعدة البيانات. بعد اكتمال التنفيذ ، سيتم فحص قاعدة البيانات ، كما هو موضح في الشكل أدناه لتحديث النتائج.
1.2 طريقة التحميل
تشبه الوظيفة طريقة GET ، كما أنها تحصل على بيانات من قاعدة البيانات وتزامنها في الكائن. هذه الطريقة تدعم العملية البطيئة. يرجع كائن كائن ثابت أو وكيل ، لذلك يجب تحويله.
public void testload1 () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ // لن يتم فحص بيان الاستعلام على الفور لأن الحمل يدعم كسول (تحميل تأخير/تحميل كسول) // ما الذي يجب تعليمه كسول؟ فقط عند استخدام هذا الكائن حقًا ثم يتم إنشاؤه ، سيتم إصدار بيان الاستعلام عن السبات. هو أساسا تحسين الأداء. الكسول هو ميزة مهمة للغاية في السبات. كيف يتم تنفيذ كسول السبات؟ تنفذها كائنات الوكيل. تستخدم الكائنات الوكيل بشكل أساسي // التي تم إنشاؤها بواسطة مكتبة CGLIB بدلاً من الوكيل الديناميكي لـ JDK ، لأن الوكيل الديناميكي لـ JDK يمكنه فقط إنشاء وكيل للفئات التي تنفذ الأعذار. CGLIB يمكن توليد // الوكيل للفصول. يعتمد SESTER SESTER ASSER ASSER = (المستخدم). System.out.println (user.getName ()) ؛ // الحالة المستمرة // كائنات ذات حالة مستمرة ، عندما تتغير خصائص الكائن // ستراجع repernate user.setName ("Zhaoliu") ؛ session.getTransaction (). الالتزام () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} استعلام للحصول على كائن المستخدم كما هو موضح في الشكل أدناه:
تحليل الشكل أعلاه ، لا يكتمل كائن المستخدم الذي تم الحصول عليه ، أو لا يوجد كائن مستخدم شائع ، لكنه وكيل. يستخدم CGLIB لتحميل الكائن مسبقًا ويتم إنشاؤه حقًا عند استخدام الكائن.
1.3 احصل على تحميل مقابل
احصل على طرق التحميل مهمة للغاية. غالبًا ما يتم أخذها أثناء المقابلات مع السبات. فيما يلي مقارنة بين الاثنين التاليين.
أوجه التشابه:
(1) الوظائف هي نفسها ، ويتم تحويل بيانات العلاقة إلى كائنات ؛
(2) طريقة الاستخدام هي نفسها ، ويحتاج أيضًا اختلافان في المعلمات:
(1) تدعم طريقة التحميل التشغيل الكسول ، وتتحمل الكائن المسبق ، ويتم إنشاؤه فقط عند استخدامه. الحصول على تحويل البيانات العلائقية مباشرة إلى كائنات ؛
(2) إذا لم يكن كائن تحميل التحميل موجودًا ، فسيتم إلقاء كائن inbornotfoundException ، وإذا لم تحصل GET على البيانات ، فسيتم إرجاعها.
2. بناء كائنات منفصلة يدويًا
هناك طريقة أخرى للحصول على كائن. إنه يختلف عن طرق الحصول والتحميل. إنها طريقة يدوية. أولاً ، يكون الكائن شائعًا ، ثم يتم الحصول على بيانات الكائن عن طريق صياغة معرف. الطريقة كما يلي:
public void testuer () {جلسة الجلسة = null ؛ جرب {session = hibernateutils.getSession () ؛ Session.begintransaction () ؛ // بناء يدويًا مستخدم ObjectUser detached = مستخدم جديد () ؛ user.setid ("8A1B653745BCC7B50145BCC7B7B7140001") ؛ // الحالة المستمرة // كائن مع حالة مستمرة ، عندما تتغير خصائص الكائن // سوف تتم مزامنة session.getTransaction (). } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ }} عرض مخطط النتيجة التي تم الحصول عليها:
يتم استخدام مخطط نتيجة التحليل في الكود لتعيين رقم المعرف للكائن. بعد صياغة رقم المعرف ، يمكن تشغيل الكائن. بعد إرسال المعاملة ، يتم مزامنتها مع قاعدة البيانات ، ويتم استخدام المواصفات اليدوية لتحديد معلومات الكائن يدويًا.
2.1 حذف الطريقة
لحذف الكائن المحدد في قاعدة البيانات ، يجب تحويل الكائن إلى الحالة المستمرة قبل حذفه. يمكنك استخدام GET أو تحميل أو طرق يدوية لتحديد الكائن. الطريقة كما يلي:
الجلسة = hibernateutils.getSession () ؛ Session.begintransaction () ؛ مستخدم المستخدم = (المستخدم) SESSITAL.LOAD (user.class ، "8A1B653745BCC6D50145BCC6D67A0001") ؛ //يوصى باستخدام هذه الطريقة لحذف Session.delete (user) ؛
2.2 تحديث
تحديث البيانات ، ستعمل هذه الطريقة على تعديل البيانات في قاعدة البيانات. عند استخدامه ، سيكون هناك موقف في الكمية ، والتي ستقوم بتحديث قيمة حقل معين في قاعدة البيانات أو تحديث الصف بالكامل من قاعدة البيانات.
2.2.1 تحديث قيمة الحقل
إذا كنت ترغب فقط في تحديث قيمة حقل معين ، قبل التحديث ، تحتاج إلى استخدام التحميل أو الوصول إلى تحويل الكائن إلى رمز حالة ثابت كما يلي:
// الحصول على جلسة كائن الجلسة = hibernateutils.getSession () ؛ // Open Transaction Session.BeginTransaction () ؛ // أو يمكنك استخدام طريقة أخرى لتمكين //session.getTransaction (). // التحميل للحصول على كائن المستخدم // الطريقة 1: استخدم طريقة التحميل // مستخدم المستخدم = (المستخدم) Session.Load (user.class ، "8A1B653745BCC7B50145BCC7B7140001") ؛ // الطريقة 2: الحصول يدويًا على المستخدم = مستخدم جديد () ؛ user.setid ("8A1B653745BCC7B50145BCC7B7B7140001") ؛ // تحديث اسم user.setName ("Zhangsan") ؛ Session.update (user) ؛ session.getTransaction (). الالتزام () ؛2.2.2 تحديث السطر بأكمله <br /> إذا كنت ترغب في تحديث بيانات السطر بأكمله ، فيمكنك تحويل الحالة يدويًا إلى الحالة المنفصلة وتحديد قيمة المعرف يدويًا للكائن. الرمز كما يلي:
// الحصول على جلسة كائن الجلسة = hibernateutils.getSession () ؛ // Open Transaction Session.BeginTransaction () ؛ // أو يمكن استخدام طريقة أخرى لتمكين //session.getTransaction (). // احصل يدويًا على المستخدم = مستخدم جديد () ؛ user.setid ("8A1B653745BCC7B50145BCC7B7B7140001") ؛ // تحديث اسم user.setName ("Zhangsan") ؛ Session.update (user) ؛ session.getTransaction (). الالتزام () ؛ عرض نتائج التحديث:
بتحليل نتائج التحديث ، يقوم بالفعل بتحديث الصف الكامل من بيانات قاعدة البيانات. هناك الكثير من أوجه عدم اليقين في عملية التحديث هذه ولا ينصح باستخدامها.
2.3 حفظ الطريقة
أدخل البيانات. عند تنفيذ طريقة حفظ ، يتم استدعاء بيان إدراج قاعدة البيانات لإضافة صف جديد إلى قاعدة البيانات. سيتم تحويل الكائن المحفوظ إلى حالة مستمرة. في هذه الحالة ، يمكن للكائن تحديث الكائن مرة أخرى وسيتم تحديثه إلى قاعدة البيانات مع تغييرات عند إرسال المعاملة أخيرًا. على النحو التالي:
public void testSave2 () {جلسة الجلسة = null ؛ المعاملة tx = فارغة ؛ جرب {session = hibernateutils.getSession () ؛ // Open Transaction tx = session.begintransaction () ؛ // مستخدم حالة عابرة = مستخدم جديد () ؛ user.setName ("Zhangsi") ؛ user.setPassword ("123") ؛ user.setCreateTime (Date ()) ؛ user.setExpiretime (date ()) ؛ // الحالة المستمرة // كائن مع تغييرات الحالة المستمرة عندما تتغير خصائص الكائن // سوف تتم مزامنة الجلسة (المستخدم) ؛ user.setName ("lisi") ؛ tx.Commit () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ if (tx! = null) {tx.rollback () ؛ }} أخيرًا {hibernateUtils.Closedessesse (الجلسة) ؛ } // حالة منفصلة} عرض مثال التشغيل السابق عرض نتيجة:
نتيجة التحليل: تعمل الجلسة في الواقع على عمليتين عند تقديم المعاملة. بالاقتران مع عملية التحديث في الكود ، أولاً ، يتم إضافة كائن مستخدم جديد ، ثم يتم تنفيذ عملية حفظ. سوف يستدعي بيان إدراج ، ثم يتم إجراء عملية setName في الكود ، ويتم إعادة تعديل الاسم. ومع ذلك ، لم يتم مزامنتها مع قاعدة البيانات في هذا الوقت ولكن في الذاكرة. في هذا الوقت ، ستكون هناك دولتان. نقول أن بت البيانات في هذا الوقت هي بيانات قذرة ، وأخيراً تحديث قاعدة البيانات عند إرسال المعاملة.