Где я должен открывать и закрывать сеанс Hibernate в веб-приложении Struts2 при использовании Hibernate Interceptors

Я использую объект сеанса Hibernate Interceptor для каждой операции CRUD в моем приложении Struts2, для этого я открыл сеанс с реализованным объектом Hibernate Interceptor.

Я хочу использовать только один сеанс Hibernate на один запрос во всем приложении Struts2.

Для этого я открыл сеанс Hibernate в методе Struts Interceptor intercept() и закрыл сеанс Hibernate до завершения Struts Interceptor intercept().

Но в своем приложении я использовал вызовы «цепного действия». в то время я получаю Session close Exception, если я пытаюсь использовать сеанс Hibernate в следующем цепном действии.

Пожалуйста, помогите мне, где я открываю и закрываю сеанс Hibernate Interceptor в приложении Struts2.

Перехватчик

public class MyStrutsInterceptor implements Interceptor {
  public void init() {
    // I created sessionfactroy object as a static variable 
  }

  public void destroy() {
    // I released the DB resources 
  }
  public String intercept(ActionInvocation invocation) throws Exception {
    Session session = sessionFactory().openSession(new MyHibernateInterceptor());
    invocation.invoke();
    session.close();
  }
}

Реализованный класс Hibernate Interceptors

public class MyHibernateInterceptor extends EmptyInterceptor{  
    //Override methods
}

Когда я использую вызов цепочки действий, оператор invocation.invoke(); и session.close(); вызывается 2 раза.


person swamy    schedule 22.10.2014    source источник
comment
Нет i, есть только I; пожалуйста, запомните это для следующих вопросов ;)   -  person Andrea Ligios    schedule 23.10.2014


Ответы (1)


Вы можете установить сеанс на ThreadLocal

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<>();

private static Session getSession() throws HibernateException {
  Session session = threadLocal.get();

  if (session == null || !session.isOpen()) {
    session = sessionFactory.openSession();
    threadLocal.set(session);
  }

  return session;
}

private static void closeSession() throws HibernateException {
  Session session = (Session) threadLocal.get();
  threadLocal.set(null);

  if (session != null) {
    session.close();
  }
}

public String intercept(ActionInvocation invocation) throws Exception {
  Session session = getSession();
  String result;
  try {
    result = invocation.invoke();
  } finally {
    closeSession();
  }
  return result;
}
person Roman C    schedule 23.10.2014