التعليقات التوضيحية
تعليقات السبات هي أحدث طريقة لا تستخدم ملفات XML لتحديد التعيينات. يمكن استخدام التعليقات التوضيحية في بيانات التعيين XML التي يتم فصلها أو استبدالها.
تعتبر تعليقات Hibernate طريقة قوية لتوفير تعيينات من كائنات البيانات الوصفية والجداول العلائقية. جميع البيانات الوصفية معلقة مع ملف Pojo Java. يمكن أن يساعد ذلك المستخدمين على فهم بنية الجدول و POJO أثناء عملية التطوير.
إذا كنت تنوي نقل التطبيق إلى تطبيقات ORM الأخرى الخاصة بـ EJB3 ، فيجب عليك استخدام التعليقات التوضيحية لتمثيل معلومات التعيين ، ولكن إذا كنت تريد مرونة أكبر ، فيجب عليك استخدام رسم الخرائط المستندة إلى XML.
ضبط شرح السبات في البيئة أولاً ، يجب عليك التأكد من أنك تستخدم JDK5.0 ، وإلا ، فأنت بحاجة إلى ترقية JDK إلى الدعم الأصلي JDK5.0 مع التعليقات التوضيحية.
ثانياً ، تحتاج إلى تثبيت حزمة توزيع التعليقات التوضيحية لـ Hibernate 3.x ، يمكنك استخدام SourceForge: (تنزيل تعليقات السبات) ونسخ heibernate-annotations.jar ، lib/libernate-comons-annotations.jar و lib/ejb3-persistence.
مثيل الفصل الدراسي:
كما ذكرنا ، يمكن أن تساعد جميع البيانات الوصفية التي تعمل مع أعمال شرح السبات في ملف Pojo Java أعلاه المستخدمين على فهم كل من بنية الجدول و POJO أثناء التطوير.
النظر في الكائن الذي سيتم تخزينه باستخدام جدول الموظف التالي:
قم بإنشاء موظف الجدول (ID int not null auto_increment ، first_name varchar (20) الافتراضي ، last_name varchar (20) الافتراضي ، الراتب الافتراضي الفارغ ، المفتاح الأساسي (المعرف)) ؛
ما يلي هو تعيين فئة الموظف الكائن مع التعليقات التوضيحية لارسم مع جدول الموظف المحدد:
استيراد javax.persistence.*؛ @intity @table (name = "exeipleese") الموظف الفئة العامة {idgeneratedValueColumn (name = "id") private int id ؛ column (name = "first_name") سلسلة خاصة firstName ؛ column (name = "last_name") سلسلة خاصة ؛ column (name = "Salary") Private Int Salary ؛ الموظف العام () {} public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getFirstName () {return firstName ؛ } public void setFirstName (string first_name) {this.firstName = first_name ؛ } السلسلة العامة getLastName () {return lastName ؛ } public void setLastName (String last_name) {this.lastname = last_name ؛ } public int getSalary () {return salary ؛ } public void setSalary (int salary) {this.salary = salary ؛ }}يكتشف Hibernate أن التعليق التوضيحي لـ ID هو ضد الحقل ويفترض أنه ينبغي عليه الوصول إلى خصائص كائن مباشرة من خلال مجال وقت التشغيل. إذا تم شرح ED باستخدام طريقة GetID () ، فسيتم الوصول إلى العقار افتراضيًا عبر أساليب Getter و Setter. لذلك ، يتم أيضًا وضع جميع التعليقات الأخرى في أي من الحقل أو طريقة getter ، كما هو محدد أدناه للسياسة. يشرح القسم التالي التعليقات المستخدمة في الفصل أعلاه.
@التعليق التوضيحي:
يتم تضمين وصف مواصفات EJB3 في حزمة javax.persistence ، لذلك نستورد هذه الحزمة كخطوة أولى. ثانياً ، استخدمنا شرح @entity للاحتفال بهذه الفئة كفئة للموظف بين الكيان ، لذلك يجب أن يكون لها مُنشئ بدون معلمة ، وهو مرئي أخيرًا مع الحماية.
التعليق التوضيحي table:
يسمح التعليق التوضيحي @Table باستخدام الجدول المحدد للاحتفاظ بمعلومات مفصلة حول الكيان في قاعدة البيانات.
يوفر التعليق التوضيحي القابل للتطبيق أربع خصائص تسمح بتجاوز اسم الجدول ، ودليله ، ومخططه ، وتنفيذ قيود فريدة على الأعمدة في الجدول. الآن ، نحن نستخدم اسم جدول الموظف الآن.
id و @generatedValue التعليقات التوضيحية:
سيكون لكل فول كيان مفتاح أساسي مشروح في التعليق التوضيحي للصف. يمكن أن يكون المفتاح الأساسي حقلًا واحدًا أو مزيجًا من الحقول المتعددة وفقًا لهيكل الجدول.
بشكل افتراضي ، يحدد التعليق التوضيحي لـ ID تلقائيًا استراتيجية توليد المفاتيح الأساسية الأكثر ملاءمة للاستخدام ، ولكن يمكن استخدامها من خلال تطبيق توضيح GeneratedValue ، الذي يقبل معلمتين ، استراتيجية ومولد ، لا تتم مناقشته هنا ، فقط استخدم استراتيجية توليد المفاتيح الافتراضية الافتراضية. دع Hibernate تحديد نوع المولد لاستخدامه لجعل قابلية نقل الكود بين قواعد البيانات المختلفة.
التعليق التوضيحي column:
يتم استخدام التعليق التوضيحي column لتحديد تفاصيل العمود إلى حقل أو خاصية سيتم تعيينها. يمكن شرح الخصائص الأكثر استخدامًا بشكل شيوع باستخدام الأعمدة:
تسمح سمة الاسم بشكل صريح بتحديد اسم العمود.
تتيح خاصية الطول أن تقوم بتخطيط حجم العمود بشكل خاص لقيمة السلسلة.
تتيح الخاصية الباطلة أن يتم وضع علامة على العمود ليس عند إنشاء المخطط.
تتيح الخاصية الفريدة الأعمدة التي تحتوي على قيم فريدة فقط.
إنشاء فئة تطبيق:
أخيرًا ، سنقوم بإنشاء الطريقة الرئيسية () لفئة التطبيق لتشغيل التطبيق. سنستخدم هذا التطبيق لحفظ بعض سجلات الموظفين ، وبعد ذلك سوف نتقدم بطلب للحصول على سجلات على عمليات CRUD.
استيراد java.util.list ؛ استيراد java.util.date ؛ استيراد java.util.iterator ؛ استيراد org.hibernate.hibernateException ؛ استيراد org.hibernate.session ؛ استيراد org.hibernate.transaction ؛ استيراد org.hibernate.cfg.annotationConfiguration ؛ استيراد org.hibernate.sessionfactory ؛ استيراد org.hibernate.cfg.configuration ؛ إدارة الطبقة العامة {private static sessionfactory ؛ public static void main (string [] args) {try {factory = new endationConfiguration (). تكوين (). //addpackage("com.xyz ") // إضافة حزمة إذا تم استخدامها. addannotatedClass (الموظف. class). BuildSessionFactory () ؛ } catch (throwable ex) {system.err.println ("فشل في إنشاء كائن SessionFactory." + ex) ؛ رمي استثناء جديد initializererror (ex) ؛ } managementemive me = new ManagementEmployee () ؛ / * إضافة عدد قليل من سجلات الموظفين في قاعدة البيانات */ integer empid1 = me.addemplyee ("Zara" ، "ali" ، 1000) ؛ integer Empid2 = me.addemplyee ("daisy" ، "das" ، 5000) ؛ integer empid3 = me.addemplyee ("John" ، "Paul" ، 10000) ؛ / * اذكر جميع الموظفين */ me.listemplyee () ؛ / * تحديث سجلات الموظف */ me.updateemplyee (Empid1 ، 5000) ؛ / * حذف موظف من قاعدة البيانات */ me.deleteemplyee (EMPID2) ؛ / * اذكر قائمة جديدة للموظفين */ me.listemplyee () ؛ } / * طريقة لإنشاء موظف في قاعدة البيانات * / public integer addemployee (سلسلة fname ، سلسلة lname ، int راتب) {جلسة الجلسة = factory.opensession () ؛ المعاملة tx = فارغة ؛ عدد صحيح الموظف = فارغ ؛ حاول {tx = session.begintransaction () ؛ الموظف الموظف = موظف جديد () ؛ الموظف. الموظف. الموظف. effereneiD = (عدد صحيح) الجلسة. save (موظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ } إرجاع الموظف ؛ } / * طريقة لقراءة جميع الموظفين * / public void listemployees () {Session Session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ قائمة الموظفين = session.createquery ("من الموظف"). list () ؛ لـ (iterator iterator = amploy.iterator () ؛ iterator.hasnext () ؛) {efferene efference = (ameptory) iterator.next () ؛ system.out.print ("الاسم الأول:" + efferene.getFirstName ()) ؛ system.out.print ("الاسم الأخير:" + efferene.getLastName ()) ؛ System.out.println ("Salary:" + efferene.getSalary ()) ؛ } tx.commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة تحديث الراتب للموظف * / public void uptordeMployee (integer amployeeId ، int salary) {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ موظف الموظف = (الموظف) جلسة. الموظف. session.update (الموظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة لحذف موظف من السجلات * / public void deleteemployee (integer efferenceId) {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ موظف الموظف = (الموظف) جلسة. Session.delete (موظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }}} تكوين قاعدة البيانات:
الآن ، دعنا نقوم بإنشاء ملف تكوين hibernate.cfg.xml لتحديد المعلمات ذات الصلة لقاعدة البيانات.
<؟ org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-افترض أن الطلاب هو اسم قاعدة البيانات-> name = "hibernate.connection.username"> الجذر </property> <property name = "hibernate.connection.password"> cohondob </sopporty> </essing-factory> </ hibernate-configuration>
تجميع وتنفيذ:
فيما يلي الخطوات لتجميع وتشغيل التطبيق أعلاه. تأكد من تعيين المسار و classpath بشكل مناسب قبل التجميع والتنفيذ.
قم بإزالة ملف تعيين الموظف. hbm.xml من المسار.
قم بإنشاء ملف مصدر الموظف. java كما هو موضح في الصورة أعلاه وتجميعه.
قم بإنشاء ملف مصدر management.java كما هو موضح في الصورة أعلاه وتجميعه.
قم بتنفيذ ملف ManagementEmployee الثنائي لتشغيل البرنامج.
سيتم الحصول على النتائج التالية وستكون السجلات في جدول الموظفين.
$ java management java ......... سيتم عرض رسائل سجل مختلفة هنا ......... الاسم الأول: Zara اسم العائلة: علي الراتب: 1000First الاسم: Daisy العائلة: Das Salary: 5000First الاسم: John Last: Paul Salary: 10000first الاسم: Zara اسم العائلة: ALI: 5000First Name: John Last Nast: 10000.
إذا قمت بفحص جدول الموظف ، فيجب أن يكون لديه السجلات التالية:
mysql> حدد * من الموظف ؛+----+------------+-----------+--------+| معرف | first_name | last_name | الراتب |+----+------------+-----------+--------+| 29 | زارا | علي | 5000 || 31 | جون | بول | 10000 |+----+------------+-----------+--------+2 صفوف في المجموعة (0.00 secmysql>
مخبأ
إن التخزين المؤقت هو كل شيء يتعلق بتحسين الأداء للتطبيق ويقع بين التطبيق وقاعدة البيانات لتجنب إمكانية الوصول إلى قاعدة البيانات المتعددة والسماح للتطبيقات المحددة للأداء بالأداء بشكل أفضل.
يعتبر التخزين المؤقت أمرًا مهمًا بالنسبة للإسبات ، ويعتمد مخططًا متعدد المستويات للتخزين المؤقت الموضح أدناه:
ذاكرة التخزين المؤقت المستوى 1:
ذاكرة التخزين المؤقت من المستوى الأول هي ذاكرة التخزين المؤقت للجلسة ، وهي ذاكرة التخزين المؤقت الإلزامية ، ويجب تمرير جميع الطلبات من خلالها. يتم تشغيل كائنات الجلسة باستمرار بواسطة كائنات قبل إرسالها إلى قاعدة البيانات.
إذا تم إصدار تحديثات متعددة ، فإن السبات يحاول تأخير التحديثات لأطول فترة ممكنة لتقليل عدد التحديثات التي تم إصدارها SQL. إذا أغلقت الجلسة ، فستفقد جميع الكائنات المخزنة مؤقتًا ، أو مستمرة ، أو تحديثها في قاعدة البيانات.
ذاكرة التخزين المؤقت المستوى 2:
يعد ذاكرة التخزين المؤقت من المستوى 2 اختياريًا وذاكرة التخزين المؤقت من المستوى 1 والتي سيتم البحث عنها دائمًا قبل أي محاولة للعثور على ذاكرة التخزين المؤقت من المستوى 2 لكائن. يمكن تكوين ذاكرة التخزين المؤقت من المستوى الثاني على أساس كل فئة وفرد ، ومسؤولية بشكل أساسي عن الكائنات المخزولة في الجلسة.
يمكن لأي ذاكرة التخزين المؤقت لجهة خارجية استخدام السبات. توفر واجهة org.hibernate.cache.cacheprovider ، ومن الضروري تنفيذ تنفيذ ذاكرة التخزين المؤقت للمقبض لتوفير السبات.
ذاكرة التخزين المؤقت مستوى الاستعلام:
يقوم Hibernate أيضًا بتنفيذ التكامل الضيق لذاكرة التخزين المؤقت لنتائج نتائج الاستعلام وذاكرة التخزين المؤقت المستوى 2.
هذه ميزة اختيارية تتطلب اثنين من ذاكرة التخزين المؤقت المادية الإضافية لحفظ نتائج الاستعلام المخزنة مؤقتًا والمناطق عند آخر تحديث جدول. هذا مفيد جدًا للاستعلامات التي غالباً ما يتم تشغيلها بنفس المعلمات.
ذاكرة التخزين المؤقت المستوى 2:
يستخدم Hibernate ذاكرة التخزين المؤقت من المستوى 1 ، افتراضيًا ، لا تفعل شيئًا مع ذاكرة التخزين المؤقت من المستوى 1. دعنا نذهب مباشرة إلى ذاكرة التخزين المؤقت من المستوى الثاني الاختياري. لا تستفيد جميع الفئات من التخزين المؤقت ، لذلك من المهم تعطيل ذاكرة التخزين المؤقت من المستوى 2.
يتم تعيين ذاكرة التخزين المؤقت المستوى 2 Hibernate على خطوتين. أولاً ، يجب أن تقرر استراتيجية التزامن لاستخدامها. بعد ذلك ، يمكنك تكوين انتهاء صلاحية ذاكرة التخزين المؤقت واستخدام ذاكرة التخزين المؤقت لتوفير سمات ذاكرة التخزين المؤقت الفعلية.
استراتيجية التزامن:
تعد سياسة التزامن وسيطًا مسؤولًا عن تخزين عناصر البيانات في ذاكرة التخزين المؤقت واستردادها من ذاكرة التخزين المؤقت. إذا كنت ترغب في تمكين التخزين المؤقت من المستوى 2 ، فسيتعين عليك تحديد سياسة التزامن ذاكرة التخزين المؤقت التي يجب استخدامها لكل فئة وجمع مستمر.
المعاملات: استخدام هذه الاستراتيجية لقراءة البيانات بشكل أساسي لمنع المعاملات المتزامنة للبيانات التي عفا عليها الزمن أمر بالغ الأهمية في حالات التحديثات النادرة.
القراءة والكتابة: مرة أخرى باستخدام هذه الاستراتيجية ، يعد القراءة الرئيسية للبيانات أمرًا بالغ الأهمية لمنع المعاملات المتزامنة من البيانات التي لا معنى لها في حالات نادرة من التحديثات.
Norrict-Read-Write: لا تضمن هذه الاستراتيجية الاتساق بين ذاكرة التخزين المؤقت وقاعدة البيانات. من خلال هذه الاستراتيجية ، لا يتمثل المفتاح في الانتباه إذا تم تغيير البيانات نادراً ما يتم تغيير إمكانية وجود بيانات قديمة.
القراءة فقط: سياسة التزامن مناسبة للبيانات ولن تتغير أبدًا. البيانات المستخدمة للرجوع إليها فقط.
إذا كنا نريد استخدام ذاكرة التخزين المؤقت من المستوى الثاني كصف للموظفين لدينا ، فلنضيف عناصر التعيين المطلوبة لإخبار السبات باستخدام سياسة ذاكرة التخزين المؤقت القابلة للقراءة والقابلة للكتابة لمثيلات الموظفين.
<؟ Table = "Employee"> <meta attribute = "class-description"> تحتوي هذه الفئة على تفاصيل الموظف. </meta> <cache useate = "read-write"/> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstName" column = "first_name" type = "string"/> <property name = "listname" column = "type =" type = propert </class> </hibernate mapping>
تخبر خاصية Usage = "Read-Write" Hibernate باستخدام ذاكرة التخزين المؤقت المحددة بواسطة سياسة التزامن القراءة والكتابة.
مزود ذاكرة التخزين المؤقت:
بعد النظر في سياسة التزامن في فصل مرشح ذاكرة التخزين المؤقت ، فإن الخطوة التالية هي تحديد مزود ذاكرة التخزين المؤقت. قوات السبات في اختيار ذاكرة التخزين المؤقت لخدمة التطبيق بأكمله.
ذاكرة التخزين المؤقت المقدمة في ملف تكوين hibernate.cfg.xml المحدد. حدد ehcache كموفر ذاكرة التخزين المؤقت من المستوى الثاني:
<؟ org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-افترض أن الطلاب هو اسم قاعدة البيانات-> name = "hibernate.connection.username"> الجذر </property> <property name = "hibernate.connection.password"> root123 </property> <property name = "hibernate.cache.provider_class"> org.cache.cache.ehcacheprovider </propert Resource = "exexectee.hbm.xml"/> </session-factory> </hibernate-configuration>
الآن ، تحتاج إلى تحديد خصائص منطقة ذاكرة التخزين المؤقت. لدى Ehcache ملف التكوين الخاص به ehcache.xml ، في التطبيق في classpath. في ehcache.xml ، قد يبدو تكوين ذاكرة التخزين المؤقت فئة الموظف هكذا:
<diskstore path = "java.io.tmpdir"/> <defaultCacheMaxElementSinMemory = "1000" eternal = "false" timetoidleSeconds = "120" name = "exempleee" maxElementSinMemory = "500" eternal = "true" timetoidleSeConds = "0"
هذا كل شيء ، تمكن الآن من ذاكرة التخزين المؤقت الثانوية في فئة الموظف والسباحة التي لديها الآن ذاكرة التخزين المؤقت الثانوية ، عندما يتصفح الموظف أو عندما يتم تحميل الموظف بواسطة معرف.
يجب عليك تحليل جميع فصولك وتحديد استراتيجية التخزين المؤقت المناسبة لكل فصل. في بعض الأحيان ، قد يؤدي ذاكرة التخزين المؤقت الثانوية إلى تدهور أداء التطبيق. لذلك يوصى بالتطبيق القياسي الذي لا يمكّن التخزين المؤقت لأول مرة ، وهو مناسب جدًا للتخزين المؤقت والتحقق من الأداء. إذا لم تحسن ذاكرة التخزين المؤقت أداء النظام ، فمن غير المعقول صنع أي نوع من ذاكرة التخزين المؤقت.
ذاكرة التخزين المؤقت مستوى الاستعلام:
باستخدام ذاكرة التخزين المؤقت للاستعلام ، يجب تنشيطه أولاً في ملف تكوين الخاصية hibernate.cache.use_query_cache = "true". إذا تم تعيين هذه الخاصية على TRUE ، فدع Hibernate إنشاء ذاكرة التخزين المؤقت المطلوبة في الذاكرة لحفظ مجموعة الاستعلام والمعرف.
بعد ذلك ، باستخدام ذاكرة التخزين المؤقت للاستعلام ، يمكنك استخدام طريقة setCachable (Boolean) لفئة الاستعلام. على سبيل المثال:
يدعم Hibernate أيضًا دعم ذاكرة التخزين المؤقت ذات الحبيبات الدقيقة من خلال مفهوم منطقة ذاكرة التخزين المؤقت. ذاكرة التخزين المؤقت هي جزء من ذاكرة التخزين المؤقت المعطى اسم.
يستخدم هذا الرمز طريقة لإخبار السبات لتخزين وإيجاد استعلامات على الموظفين في ذاكرة التخزين المؤقت.