ハイバーネート セッションファクトリー
Hibernate SessionFactoryは、セッションを取得し、データベース操作を実行するためのファクトリークラスです。
ハイバーネート セッションファクトリー
HibernateのSessionFactoryは、getCurrentSession()、openSession()、およびopenStatelessSession()の三つのメソッドを提供し、これらを通じてSessionオブジェクトを取得できます。
HibernateのSessionFactoryのgetCurrentSession
HibernateのSessionFactoryの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)
このセッションオブジェクトはHibernateコンテキストに属しているので、閉じる必要はありません。セッションファクトリが閉じられると、このセッションオブジェクトも閉じられます。Hibernateのセッションオブジェクトはスレッドセーフではないため、マルチスレッド環境では使用すべきではありません。新しいセッションを開くよりも相対的に速いため、シングルスレッド環境では使用できます。
HibernateのSessionFactoryでセッションを開く
HibernateのSessionFactoryのopenSession()メソッドは常に新しいセッションを開きます。データベース操作が完了したら、このセッションオブジェクトを閉じるべきです。マルチスレッド環境では、各リクエストのために新しいセッションを開く必要があります。ウェブアプリケーションフレームワークでは、要件に基づいて各リクエストのために新しいセッションを開くか、各セッションのためにセッションを開くことを選択できます。
Hibernate SessionFactory openStatelessSession
HibernateのSessionFactoryのopenStatelessSession()メソッドは、StatelessSessionのインスタンスを返します。引数としてjava.sql.Connectionオブジェクトを渡すことでステートレスセッションオブジェクトを取得することができる別のオーバーロードされたメソッドもあります。HibernateのStatelessSessionは、第一レベルキャッシュを実装せず、第二レベルキャッシュとも相互作用しません。ステートレスであるため、トランザクショナルな遅延書き込みや自動でのダーティチェック、関連エンティティへのカスケード操作を実装しません。コレクションもステートレスセッションによって無視されます。 ステートレスセッションを介して実行される操作は、Hibernateのイベントモデルやインターセプタをバイパスします。これは、通常のJDBC接続のようなもので、Hibernateフレームワークを使用することから得られる利点は提供しません。しかし、ステートレスセッションは特定の状況では適している場合があります。たとえば、大量のデータをデータベースに読み込む際に、Hibernateセッションにファーストレベルキャッシュメモリに大量のデータを保持させたくない場合です。Hibernate SessionFactoryメソッドの使用例を示す簡単なプログラムは以下に示されています。
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();
//Current Session - no need to close
Session currentSession = sessionFactory.getCurrentSession();
//open new session
Session newSession = sessionFactory.openSession();
//perform db operations
//close session
newSession.close();
//open stateless session
StatelessSession statelessSession = sessionFactory.openStatelessSession();
//perform stateless db operations
//close session
statelessSession.close();
//close session factory
sessionFactory.close();
}
}
これでHibernateのSessionFactoryとセッションオブジェクトを取得するための異なるメソッドについては終わりです。

