今天学习hibernate的用法,尝试编写了hibernatefilter类,就是书上写的帮助hibernate产生session和提交事务的。完事后要在web.xml里面配置,目前web.xml里面已经配置了struts2的过滤器,那么这个新来的hibernatefilter是应该配置在struts2过滤器之前还是之后呢?
    我自己尝试了一下,编写了一个Action,里面调用某个DAO保存一个实例,然后发现无论把hibernatefilter配置在struts2之前还是之后好像都没有效果。按照书上说的,有了hibernatefilter,DAO里面就不用管产生session和事务提交的问题了,所以DAO里面就只有save方法,没有getTransaction().commit()语句。
    但是我反复在Action里面调用这个DAO的save方法都不能把数据保存进数据库,但是只要我在Action里面加上getTransaction().commit()的事务提交语句后数据就保存到数据库了。因此我怀疑我的hibernatefilter根本就没起到提交事务的作用。
    请问诸位:
(1):这个hibernatefilter是不是不需要有?
(2):这个hibernatefilter和struts2的配置先后顺序是什么?
(3):怎么查看我的hibernatefilter起没起作用呢?为什么我的好像不起作用呢?
(4):hibernatefilter里面有很多log.debug()语句,这些日志语句是在eclipse的控制台显示吗?
附上参考书上的代码:
public class HibernateFilter implements Filter { private static Log log = LogFactory.getLog(HibernateFilter.class); public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
SessionFactory sf = HibernateUtil.getSessionFactory();
request.setCharacterEncoding("UTF-8");
try {
log.debug("Starting a datebase transaction");
sf.getCurrentSession().beginTransaction();
log.debug("Request Path:\t"
+ ((HttpServletRequest) request).getServletPath());
chain.doFilter(request, response);
log.debug("Committing the datebase transaction");
sf.getCurrentSession().getTransaction().commit();
} catch (Throwable ex) {
ex.printStackTrace();
try {
log.debug("Trying to rollback datebase transaction after exception");
sf.getCurrentSession().getTransaction().rollback();
} catch (Throwable rbEx) {
log.error("Could not rollback transaction after exception!",
rbEx);
}
throw new ServletException(ex);
}
} @Override
public void init(FilterConfig filterConfig) throws ServletException { } public void destroy() { }}

解决方案 »

  1.   

    hibernate自动生成的代码,没有事物关闭的操作,需要自己手动添加上
      

  2.   

    查询不用操作,修改,添加,删除,是要操作的,不然会有异常的,hibernate自动生成的,没有事物的方法
      

  3.   

    应该没人会这样单独配置事物吧?既然你看的是树上的例子,那么,你确信跟书上的一模一样?包括所使用hibernate的版本。sessionFactory是线程安全的,通过他获取的session是线程不安全的。你debug跟一下, 看看在controller中和该类中(在到达view层之前),session是否是同一个(同一个request),看看此时的session的事物是什么状态。