今天又碰到一个花了半天时间解决的问题,其实问题解决的很简单。但还是觉得需要记录一下:
问题如下:在搭建好struts整合hibernate框架后,在测试的时候出现问题:测试代码如下:
public class LoginAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String name;
private String see;
Event myevent=new Event();
public String execute() throws Exception {
HttpServletResponse response=ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();
myevent.setTitle(request.getParameter("na"));
myevent.setAge(Integer.parseInt(request.getParameter("pass")));
myevent.setDate(new Date());
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(myevent);
session.getTransaction().commit();
// session.close();
//HibernateUtil.getSessionFactory().close();
return SUCCESS;
}
页面很简单,就是form表单传值,但是测试的时候,每次都跳转到error.jsp,即返回了error。但是查询数据库,发现又插入了值,可见是数据库操作是执行的了,将session.close();替换为HibernateUtil.getSessionFactory().close();后问题解决,但是这绝对不是正确的解决办法。因为我们不可能每次数据库连接后都要关闭sessionfactoy,最后在网上寻找答案,终于发现了一篇文章,连接如下:http://blog.sina.com.cn/s/blog_6ac4c6cb010182zg.html,讲的是opensession和getcurrentsession的区别
对于上述的两个方法,有以下区别:
1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
2. getCurrentSession ,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的。
里面有句话:
对于getCurrentSession 来说,事务提交会自动close,不需要像openSession一样自己调用close方法关闭session。看到这句话恍然大悟,
原来使用getcurrentsession方法是不需要调用session.close方法的。果然,将session.close();注释掉,一切正常了。