我在 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 次。
您可以将会话设置为
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;
}