Hibernate会话关闭已经关闭

时间:2014-04-23 15:16:12

标签: java hibernate session

我正在使用Hibernate在Tomcat上运行JSF应用程序; 我有一些dao方法来对数据库执行操作,如下所示:

*

public boolean removeJprogram(Jobprogram jp) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        org.hibernate.Transaction tx = session.beginTransaction();
        try {
            session.delete(jp);
            tx.commit();
            System.out.println("Record deleted");
            return true;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            tx.rollback();
            return false;
        }finally{
            session.close();
        }
    }

正如我在hibernate文档中读到的那样;但是我有错误会话已经关闭; 如果我没有把session.close,有时给我错误会话已经被选中或者像这样somtinh。

3 个答案:

答案 0 :(得分:2)

检查hibernate配置文件中的自动提交,它可能设置为true。

答案 1 :(得分:0)

在同一个班级中,我的方法正常运行:

public List<Jobprogram> programsForUser(Date startDate, Date endDate, Users user) {
    List programs = null;
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    org.hibernate.Transaction tx = session.beginTransaction();
    try {
        Criteria criteria = session.createCriteria(Jobprogram.class);
        if (startDate != null) {
            criteria.add(Restrictions.ge("day", startDate));
        }
        if (endDate != null) {
            criteria.add(Restrictions.le("day", endDate));
        }
        criteria.add(Restrictions.eq("users", user));
        criteria.addOrder(Order.asc("day"));
        return criteria.list();
    } catch (Exception e) {
        System.out.println(e.getMessage());
        tx.rollback();
        return null;
    }finally{
        session.close();
    }
}

所以我试图从上面的代码中删除tx.commit(),现在它工作正常;但是我想如果这是正确的工作方式.....我试着阅读关于工作单元的文章,以解决问题,但它看起来像一切模糊......

答案 2 :(得分:0)

简短说明:
正如Bassel使用openSession所回答的,代码在我提交转换时起作用;当我不提交转录时,会话定期关闭,因为pramod说,因为它不会坚持..(代码发布此信息)..如果我使用openSession或getCurrentSession

独立
Session session =  HibernateUtil.getSessionFactory().openSession();
    org.hibernate.Transaction tx = session.beginTransaction();
    try {
        session.save(jobprogram);
        session.flush();
        session.clear();
        tx.commit();
        System.out.println("Record succesfully inserted....");
        return true;
    } catch (Exception e) {
        return false;
    }finally{
        session.close();
    }

并且我可以在另一段代码中执行,但这并不会持续......:

session=HibernateUtil.getSessionFactory().getCurrentSession(); 
  try{
      org.hibernate.Transaction tx=session.beginTransaction();
       Query q = session.createQuery (
        "from Users where user_name='"+username+"' and user_pass='"+password+"'");
    user = (Users) q.list().get(0);
        return user;
    }catch(Exception e){
        return null;
    }finally{
     session.close();
 }

下一步是强调getCurrentSession和openSession之间的区别......