ה-SessionFactory של Hibernate הוא המחלקה המפעילה באמצעותה אנו מקבלים סשנים ומבצעים פעולות במסד נתונים.
SessionFactory של Hibernate
ה-SessionFactory של Hibernate מספק שלושה אמצעים באמצעותם אנו יכולים לקבל אובייקט Session –
getCurrentSession()
, openSession()
ו־openStatelessSession()
.
SessionFactory של Hibernate getCurrentSession
השיטה getCurrentSession()
של SessionFactory
של 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)
מכיוון שקיים קשר בין אובייקט ההפעלה הזה להקשר ה-Hibernate, אין לנו צורך לסגור אותו. כשמפסיקים להשתמש במפעיל הסשן, האובייקט הזה נסגר. אובייקטי הסשן ב-Hibernate אינם בטוחים לשימוש רצוני, ולכן לא ישומשו בסביבה מרובה-תחומית. ניתן להשתמש בהם בסביבה בה רק תהליכים יחידים מפעילים כי הם יחסית מהירים יותר מאשר פתיחת סשן חדש.
Hibernate SessionFactory openSession
שיטת ה-openSession()
של SessionFactory
ב-Hibernate תמיד תפתח סשן חדש. עלינו לסגור את אובייקט הסשן כשסיימנו כל הפעולות במסד הנתונים. יש לפתוח סשן חדש לכל בקשה בסביבה מרובה-תחומית. במסגרת סביבות פריימורקים של אפליקציות אינטרנט, ניתן לבחור לפתוח סשן חדש לכל בקשה או לכל סשן על פי הצורך.
Hibernate SessionFactory openStatelessSession
השיטה openStatelessSession() של SessionFactory
ב-Hibernate מחזירה מופע של StatelessSession
. ישנה שיטה נוספת המובהרת בה ניתן להעביר אובייקט java.sql.Connection
כדי לקבל אובייקט של סשן לא מחזיק יחסות עם Hibernate. StatelessSession ב-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