【问题标题】:Hibernate session close already closed休眠会话关闭已经关闭
【发布时间】:2014-04-23 15:16:11
【问题描述】:

我正在使用 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();
        }
    }

正如我在休眠文档中所读到的那样;但我有错误会话已关闭; 如果我不把 session.close,有时给我错误会话已经打开或像这样 somtinh。

【问题讨论】:

  • 你使用的是什么版本的休眠?
  • 版本为3.6.10

标签: java hibernate session


【解决方案1】:

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

【讨论】:

  • 我试过了,还是不行;我不关闭会话有时会出现错误:非法尝试将代理与两个打开的会话相关联
  • 用 openSession() 替换 (getCurrentSession())
  • YES.. 它有效,Tankyou...我想了解原因.. auto.commit 设置为 true 或 false;
【解决方案2】:

在同一个班级我有这个方法可以正常工作:

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(),现在它工作正常;但我介意这是否是做这项工作的正确方法.....我试图阅读关于工作单元的文章,以理解这个问题,但看起来一切都模糊不清..

【讨论】:

  • 在这段代码中你没有提交交易?是因为您没有尝试将任何内容持久化到 db 吗?
  • 我说的是你使用 Criteria API 的代码。
  • 是的,我只是在查询..所以提交只是为了坚持而不是查询或删除??
  • 小修正..criteria.list() 是只读操作,我们不需要将事务用于只读事务。它的开销。删除 org.hibernate.Transaction tx = session.beginTransaction();
  • 小修正..criteria.list() 是只读操作,我们不需要将事务用于只读事务。它的开销。删除 org.hibernate.Transaction tx = session.beginTransaction();
【解决方案3】:

简要介绍:
正如巴塞尔使用 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 之间的区别...

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多