使用 Hibernate 拦截器时,我应该在 Struts2 Web 应用程序中的哪里打开和关闭 Hibernate 会话

问题描述 投票:0回答:1

我在 Struts 2 应用程序中对每个 CRUD 操作使用 Hibernate Interceptor 的会话对象,为此我使用 Hibernate Interceptor 的实现对象打开了一个会话。

我想在整个 Struts 2 应用程序中对每个请求仅使用一个 Hibernate 会话。

为此,我在 Struts Interceptor

intercept()
方法中打开了一个 Hibernate 会话,并在完成之前在 Struts Interceptor
intercept()
中关闭了 Hibernate 会话。

但是,在我的应用程序中,我使用了“链式操作”调用。那时,如果我尝试在下一个链式操作中使用 Hibernate 会话,我会得到

Session close Exception

请帮助我在 Struts 2 应用程序中打开和关闭 Hibernate Interceptor 会话的位置?

拦截器:

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 次。

java hibernate session struts2 interceptor
1个回答
0
投票

您可以将会话设置为

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.