public Object intercept(Invocation invocation) throws Exception {
   try {
     Session session = sessionFactory.openSession();
     session.setFlushMode(FlushMode.MANUAL);
     SessionHolder sessionHolder = new SessionHolder(session);
     TransactionSynchronizationManager.bindResource(sessionFactory, sessionHolder);
     return invocation.invoke();
   } catch (Exception e) {
     throw e;
   } finally {
     SessionHolder sessionHolder =
         (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
     sessionHolder.getSession().close();
   }
 }
  @Override
  protected void doFilterInternal(
      HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws ServletException, IOException {

    AsyncExecutionChain chain = AsyncExecutionChain.getForCurrentRequest(request);

    SessionFactory sessionFactory = lookupSessionFactory(request);
    boolean participate = false;

    if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
      // Do not modify the Session: just set the participate flag.
      participate = true;
    } else {
      logger.debug("Opening Hibernate Session in OpenSessionInViewFilter");
      Session session = openSession(sessionFactory);
      SessionHolder sessionHolder = new SessionHolder(session);
      TransactionSynchronizationManager.bindResource(sessionFactory, sessionHolder);

      chain.push(getAsyncCallable(request, sessionFactory, sessionHolder));
    }

    try {
      filterChain.doFilter(request, response);
    } finally {
      if (!participate) {
        SessionHolder sessionHolder =
            (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
        if (!chain.pop()) {
          return;
        }
        logger.debug("Closing Hibernate Session in OpenSessionInViewFilter");
        SessionFactoryUtils.closeSession(sessionHolder.getSession());
      }
    }
  }
 @After
 public void tearDown() {
   SessionHolder sessionHolder =
       (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
   SessionFactoryUtils.closeSession(sessionHolder.getSession());
 }
Example #4
0
  public static void unbindSessionFromThread(SessionFactory sessionFactory) {
    SessionHolder sessionHolder =
        (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);

    SessionFactoryUtils.closeSession(sessionHolder.getSession());
  }