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
Comments (0)
Trackbacks (0)
Leave a comment
Trackback