在做hibernate和struts2的整合项目的过程中
写了一个有关doubleselect标签的Demo
在项目中最开始我使用了Hibernate中的OpenSessionInView的模式,即在用户每次提交请求的时候都通过Filter开启事务,请求结束就关闭事务,如下
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
Transaction tx = null;
try {
tx = HibernateSessionFactory.getSession().beginTransaction();
chain.doFilter(req, resp);
tx.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if (tx != null) {
tx.rollback();
System.out.println("rollback");
}
}
}
实现最终的需求回过头来看这个模式其实并没有在这个Hibernate和struts2的整合Demo上派上用场,因为我又在struts2中的拦截器中进行了对acting的拦截,并将事务融入了action中,如下:
public class TranInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation ai) throws Exception {
// TODO Auto-generated method stub
Transaction tx = null;
String invoke = null;
try {
tx = HibernateSessionFactory.getSession().beginTransaction();
System.out.println("enter Interceptor");
invoke = ai.invoke();
tx.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if (tx != null) {
tx.rollback();
System.out.println("rollback");
}
}
return invoke;
}
}
配置文件可参照之前写的《 Struts2 Interceptor 拦截器的使用流程 》:
http://blog.csdn.net/tctctttccc/article/details/76639478
通过拦截器同样也实现了请求和事务的相互融合,拦截器中处理事务和OpenSessionInView处理事务的模式在不同的场合有不同的用法,请大家酌情甄选。