Home > Hibernate > How to Handle Session per Request using Hibernate

How to Handle Session per Request using Hibernate

Check out the logic below :
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.ems.util.RuntimeException;

public class HibernateSessionPerRequestHandlerInterceptor implements HandlerInterceptor{
	
	protected Logger log = Logger.getLogger(this.getClass());
	
	private SessionFactory sessionFactory;

	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2) throws RuntimeException {
//		log.debug("HibernateSessionPerRequestHandlerInterceptor :: preHandle()");
	    Session sess = sessionFactory.openSession();
	    sess.beginTransaction();
	    sess.setFlushMode(FlushMode.AUTO);
	    TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(sess));
	    TransactionSynchronizationManager.initSynchronization();
	    return true;
	}
	
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws RuntimeException {
//		log.debug("HibernateSessionPerRequestHandlerInterceptor :: postHandle()");
	}
	
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception ex) throws RuntimeException {
//		log.debug("HibernateSessionPerRequestHandlerInterceptor :: afterCompletion()");
	    Session sess =sessionFactory.getCurrentSession();
	    try{
	        if(ex==null){
	            log.debug("Committing the database transaction");
	            sess.getTransaction().commit();
	        }else{
	            //An exception was thrown during the processing of the request.
	            log.debug(ex);
	            log.debug("Rolling back the database transaction");
	            sess.getTransaction().rollback();
	        }
	        if(sess.isOpen())
	         sess.close();
	    }catch(Exception e){
	        throw new RuntimeException(e);//Let the exception propagate up.
	    }finally{
	        try{
	            if(sess.isOpen()){
	                sess.close();
	            }
	        }catch(Exception e){ 
	        	throw new RuntimeException(e);
	        }
	        TransactionSynchronizationManager.unbindResource(sessionFactory);
	        TransactionSynchronizationManager.clearSynchronization();
	    }
	}

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
}
Categories: Hibernate
  1. No comments yet.
  1. No trackbacks yet.

Leave a comment