package util;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
/**
* スレッドローカルなセッション管理クラス
*/
public class SessionManager {
/**
* シングルトンのセッションファクトリ
*/
private static final SessionFactory sessionFactory;
static{
try{
sessionFactory = new Configuration().configure().buildSessionFactory();
}catch(Throwable e){
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
/**
* スレッドローカルな現在のセッション
*/
private static final ThreadLocal currentSession = new ThreadLocal();
/**
* スレッドローカルな現在のトランザクション
*/
private static final ThreadLocal currentTransaction = new ThreadLocal();
/**
* 現在のスレッドに対応するセッションを取得する
* @return Session
* @throws HibernateException
*/
public static Session getCurrentSession() throws HibernateException{
Session session = (Session) currentSession.get();
if( session == null ){
session = sessionFactory.openSession();
currentSession.set(session);
}
return session;
}
/**
* セッションを閉じる
* @throws HibernateException
*/
public static void closeSession() throws HibernateException{
//トランザクションが終了してない場合は、ロールバックを行う
rollback();
Session session = (Session) currentSession.get();
if( session != null ){
currentSession.set(null);
session.close();
}
}
/**
* トランザクションを開始する
* @throws HibernateException
*/
public static void beginTransaction() throws HibernateException{
Transaction transaction = (Transaction) currentTransaction.get();
if( transaction == null ){
Session session = getCurrentSession();
transaction = session.beginTransaction();
currentTransaction.set(transaction);
}
}
/**
* トランザクションをコミットする
* @throws HibernateException
*/
public static void commit() throws HibernateException{
Transaction transaction = (Transaction) currentTransaction.get();
if( transaction != null ){
currentTransaction.set(null);
transaction.commit();
}
}
/**
* トランザクションをロールバックする
* @throws HibernateException
*/
public static void rollback() throws HibernateException{
Transaction transaction = (Transaction) currentTransaction.get();
if( transaction != null ){
currentTransaction.set(null);
transaction.rollback();
}
}
}