当前位置:编程学习 > JAVA >>

关于hibernatefilter在web.xml中配置的问题。

今天学习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() {

}

} --------------------编程问答-------------------- hibernate自动生成的代码,没有事物关闭的操作,需要自己手动添加上 --------------------编程问答--------------------
引用 1 楼  的回复:
hibernate自动生成的代码,没有事物关闭的操作,需要自己手动添加上

事务需要关闭吗,我看书上说不用手动关闭啊? --------------------编程问答-------------------- 查询不用操作,修改,添加,删除,是要操作的,不然会有异常的,hibernate自动生成的,没有事物的方法 --------------------编程问答-------------------- 应该没人会这样单独配置事物吧?既然你看的是树上的例子,那么,你确信跟书上的一模一样?包括所使用hibernate的版本。sessionFactory是线程安全的,通过他获取的session是线程不安全的。

你debug跟一下, 看看在controller中和该类中(在到达view层之前),session是否是同一个(同一个request),看看此时的session的事物是什么状态。 --------------------编程问答-------------------- 难道书上没有给你说那个用法不对,或者咋个配置之后才能用
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,