Apache Struts 2 Documentation > Home > Guides > Core Developers Guide > Interceptors > Non-IoC version of OpenSessionInViewInterceptor |

Apache Struts 2 Documentation
Non-IoC version of OpenSessionInViewInterceptor
Edit Page Browse Space Add Page Add News
Added by Philip Luppens, last edited by Ted Husted on Nov 13, 2006 (view change)

Gary was so kind to provide us a non-IoC Hibernate 'Open Session in View'-interceptor. Rather than having XWork or Spring doing the dependency injection, he sets up the Hibernate Session himself.

    /*
      * HibernateOpenSessionInViewInterceptor.java
      *
      * Created on March 18, 2006, 3:51 PM
      *
      * To change this template, choose Tools | Template Manager
      * and open the template in the editor.
      */

    package edu.washington.javawebdevelopment.webwork.interceptor;

    import com.opensymphony.xwork.ActionInvocation;
    import com.opensymphony.xwork.interceptor.AroundInterceptor;
    import edu.washington.javawebdevelopment.dao.DaoFactoryHibernate;
    import javax.servlet.ServletException;
    import org.hibernate.SessionFactory;
    import org.hibernate.StaleObjectStateException;

    /**
      *
      * @author gary
      */
    public class HibernateOpenSessionInViewInterceptor extends AroundInterceptor {
         private SessionFactory hibernateSessionFactory;

         public void init() {
             System.out.println("Initializing HibernateOpenSessionInViewInterceptor interceptor, obtaining Hibernate SessionFactory from DaoFactoryHibernate");
             hibernateSessionFactory = DaoFactoryHibernate.getSessionFactory();
         }

         public void destroy() {
         }

         public void before(ActionInvocation invocation) throws Exception {
             System.out.println("Starting a database transaction in the HibernateOpenSessionInViewInterceptor");
             hibernateSessionFactory.getCurrentSession().beginTransaction();
         }

         public void after(ActionInvocation invocation, String result) throws Exception {
             // Commit and cleanup
             try {
                 System.out.println("Committing the database transaction in the HibernateOpenSessionInViewInterceptor");
                 hibernateSessionFactory.getCurrentSession().getTransaction().commit();
             } catch (StaleObjectStateException staleEx) {
                 System.err.println("This interceptor does not implement optimistic concurrency control!");
                 System.err.println("Your application will not work until you add compensation actions!");
                 // Rollback, close everything, possibly compensate for any permanent changes
                 // during the conversation, and finally restart business conversation. Maybe
                 // give the user of the application a chance to merge some if his work with
                 // fresh data... what you do here depends on your applications design.
                 throw staleEx;
             } catch (Throwable ex) {
                 // Rollback only
                 ex.printStackTrace();
                 try {
                     if (hibernateSessionFactory.getCurrentSession().getTransaction().isActive()) {
                         System.out.println("Trying to rollback database transaction after exception");
                         hibernateSessionFactory.getCurrentSession().getTransaction().rollback();
                     }
                 } catch (Throwable rbEx) {
                     System.err.println("Could not rollback transaction after exception! - " + rbEx);
                 }

                 // Let others handle it... maybe another interceptor for exceptions?
                 throw new ServletException(ex);
             }
         }
    }