ウェブサイト検索

ハイバーネート セッションファクトリー


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とセッションオブジェクトを取得するための異なるメソッドについては終わりです。

関連記事: