Hibernateのセッションファクトリー

HibernateのSessionFactoryは、セッションを取得し、データベース操作を行うためのファクトリクラスです。

ヒベルネートのSessionFactory

ハイバネートのセッションファクトリは、Sessionオブジェクトを取得するための3つの方法を提供しています – getCurrentSession()、openSession()、openStatelessSession()。

ネイティブの日本語で以下を言い換えてください。1つのオプションで構いません:
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.scdev.hibernate.main.HibernateSessionExample.main(HibernateSessionExample.java:16)

このセッションオブジェクトはHibernateコンテキストに属しているため、それを閉じる必要はありません。セッションファクトリが閉じられると、このセッションオブジェクトも閉じられます。Hibernateのセッションオブジェクトはスレッドセーフではないため、マルチスレッド環境では使用しないでください。新しいセッションを開くよりも比較的高速なので、シングルスレッド環境で使用できます。

HibernateのSessionFactoryのopenSession

HibernateのSessionFactoryのopenSession()メソッドは常に新しいセッションを開きます。データベース操作が完了したら、このセッションオブジェクトを閉じる必要があります。マルチスレッド環境では、各リクエストごとに新しいセッションを開くべきです。Webアプリケーションフレームワークでは、要件に応じて各リクエストごとまたは各セッションごとに新しいセッションを開くことができます。

ハイバネートのSessionFactory openStatelessSession

HibernateのSessionFactoryのopenStatelessSession()メソッドは、StatelessSessionのインスタンスを返します。Hibernateでは、java.sql.Connectionオブジェクトを渡すことで状態なしのセッションオブジェクトを取得するオーバーロードされたメソッドもあります。HibernateのStatelessSessionは、一次キャッシュを実装しておらず、二次キャッシュとの相互作用もありません。状態が無いため、トランザクショナルな書き込みの背後にある自動的な更新チェックや関連エンティティへのカスケード操作も実装されていません。コレクションも状態なしセッションでは無視されます。状態なしセッションを通じて行われる操作は、Hibernateのイベントモデルとインターセプターをバイパスします。それは通常のJDBC接続のようなものであり、Hibernateフレームワークを使用することによって得られる利点は提供しません。ただし、状態なしセッションは特定の状況に適していることがあります。たとえば、大量のデータをデータベースにロードし、Hibernateセッションが一次キャッシュメモリに巨大なデータを保持しないようにしたい場合などです。以下に、HibernateのSessionFactoryメソッドの使用例を示すシンプルなプログラムがあります。

package com.scdev.hibernate.main;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;

import com.scdev.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に関する全てとセッションオブジェクトを取得するための異なる方法についての説明は終わりです。

コメントを残す 0

Your email address will not be published. Required fields are marked *