Hibernate SessionFactoryは、セッションを取得しデータベース操作を行うためのファクトリクラスです。
Hibernate SessionFactory
Hibernate SessionFactoryには、Sessionオブジェクトを取得するための3つのメソッドが提供されています –
getCurrentSession()
、openSession()
、およびopenStatelessSession()
。
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 openSession
Hibernate SessionFactory
openSession()メソッドは常に新しいセッションを開きます。すべてのデータベース操作が完了したら、このセッションオブジェクトを閉じる必要があります。マルチスレッド環境では、各リクエストごとに新しいセッションを開く必要があります。Webアプリケーションフレームワークでは、要件に応じて各リクエストごとに新しいセッションを開くか、または各セッションごとに新しいセッションを開くかを選択できます。
Hibernate SessionFactory openStatelessSession
Hibernate SessionFactory
のopenStatelessSession()メソッドは、StatelessSession
のインスタンスを返します。Hibernateでは、別のオーバーロードされたメソッドがあり、java.sql.Connection
オブジェクトを渡すことでHibernateからステートレスセッションオブジェクトを取得できます。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();
//現在のセッション - 閉じる必要はありません
Session currentSession = sessionFactory.getCurrentSession();
//新しいセッションを開く
Session newSession = sessionFactory.openSession();
//db操作を実行する
//セッションを閉じる
newSession.close();
//ステートレスセッションを開く
StatelessSession statelessSession = sessionFactory.openStatelessSession();
//ステートレスなdb操作を実行する
//セッションを閉じる
statelessSession.close();
//セッションを閉じる factory
sessionFactory.close();
}
}
HibernateのSessionFactoryとそのセッションオブジェクトを取得する異なる方法については以上です。
Source:
https://www.digitalocean.com/community/tutorials/hibernate-sessionfactory