يعتبر Hibernate SessionFactory الفئة الخاصة بالمصنع الذي نحصل من خلاله على جلسات ونقوم بأداء عمليات قاعدة البيانات.
Hibernate SessionFactory
توفر Hibernate SessionFactory ثلاث طرق يمكننا من خلالها الحصول على كائن Session –
getCurrentSession()
، openSession()
و openStatelessSession()
.
Hibernate SessionFactory getCurrentSession
يُرجى تكوين طريقة getCurrentSession()
في ملف تكوين Hibernate كما هو موضح أدناه لكي تكون الجلسة مرتبطة بالسياق.
<property name="hibernate.current_session_context_class">thread</property>
إذا لم يتم تكوينها للتعامل مع الموضوع، سنحصل على استثناء كما هو موضح أدناه.
Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured!
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
at com.journaldev.hibernate.main.HibernateSessionExample.main(HibernateSessionExample.java:16)
نظرًا لأن هذا الكائن الجلسة ينتمي إلى سياق الهايبرنيت، لا حاجة لنا أن نقوم بإغلاقه. بمجرد إغلاق مصنع الجلسات، يتم إغلاق هذا الكائن الجلسة. كائنات جلسة الهايبرنيت ليست آمنة للمشاركة بين الخيوط، لذا يجب أن لا نستخدمها في بيئة متعددة الخيوط. يمكننا استخدامها في بيئة ذات خيط واحد لأنها أسرع نسبيًا من فتح جلسة جديدة.
هايبرنيت – فتح جلسة في مصنع الجلسات
طريقة فتح جلسة في هايبرنيت SessionFactory
دائماً تفتح جلسة جديدة. يجب أن نقوم بإغلاق هذا الكائن الجلسة بمجرد الانتهاء من جميع عمليات قاعدة البيانات. يجب علينا فتح جلسة جديدة لكل طلب في بيئة متعددة الخيوط. بالنسبة لأطُرُز تطبيقات الويب، يمكننا اختيار فتح جلسة جديدة لكل طلب أو لكل جلسة بناءً على المتطلبات.
هايبرنيت – فتح جلسة Stateless في مصنع الجلسات
تعود طريقة `openStatelessSession()` في `SessionFactory` لـ Hibernate بإرجاع نموذج من `StatelessSession`. هناك طريقة أخرى محملة زائدة حيث يمكننا تمرير كائن `java.sql.Connection` للحصول على كائن جلسة بلا حالة من Hibernate. الجلسة بلا حالة في Hibernate لا تنفذ ذاكرة التخزين المؤقتة من المستوى الأول ولا تتفاعل مع أي ذاكرة تخزين مؤقتة من المستوى الثاني. نظرًا لأنها بلا حالة، فإنها لا تنفذ الكتابة التلقائية وراء الكواليس أو التحقق التلقائي من التغييرات أو إجراء العمليات التتابعية للكيانات المرتبطة. يتم تجاهل المجموعات أيضًا بواسطة الجلسة بلا حالة. تتجاوز العمليات التي تمت عبر الجلسة بلا حالة نموذج الحدث ومعايير الالتقاط في Hibernate. إنها تشبه إلى حد كبير اتصال JDBC عادي ولا توفر أي فوائد تأتي من استخدام إطار عمل Hibernate. ومع ذلك، يمكن أن تكون الجلسة بلا حالة مناسبة في بعض الحالات. على سبيل المثال، عندما نقوم بتحميل بيانات بكميات كبيرة في قاعدة البيانات ولا نريد أن تحتفظ جلسة Hibernate بالبيانات الضخمة في ذاكرة التخزين المؤقت من المستوى الأول. البرنامج البسيط أدناه يظهر استخدام طرق `SessionFactory` في Hibernate.
package com.journaldev.hibernate.main;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import com.journaldev.hibernate.util.HibernateUtil;
public class HibernateSessionExample {
public static void main(String[] args) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
// الجلسة الحالية - لا حاجة لإغلاقها
Session currentSession = sessionFactory.getCurrentSession();
// فتح جلسة جديدة
Session newSession = sessionFactory.openSession();
// أداء عمليات قاعدة البيانات
// إغلاق الجلسة
newSession.close();
// فتح جلسة بلا حالة
StatelessSession statelessSession = sessionFactory.openStatelessSession();
// أداء عمليات قاعدة البيانات بلا حالة
// إغلاق الجلسة
statelessSession.close();
// إغلاق الجلسة factory
sessionFactory.close();
}
}
هذا كل شيء بخصوص `SessionFactory` في Hibernate وطرق الحصول على كائن الجلسة.
Source:
https://www.digitalocean.com/community/tutorials/hibernate-sessionfactory