为什么hibernate返回会话是关闭错误

时间:2017-03-21 17:20:14

标签: java hibernate session

以下代码返回会话已关闭错误。从我的调试开始,我知道在执行此代码时会话已打开。在调试窗口中session.isOpen()返回false,但在运行时session.isOpen()抛出会话关闭错误。这里发生了什么......

    public static List<List<Object>> getProjectInfo(String projectName) {
    final List<List<Object>> list = new ArrayList<List<Object>>();
    final String QUERY_STRING = HibernateUtil.getSqlFactory().getProperty("query")
    final Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    session.doWork(new Work() {
        public void execute(Connection connection) throws SQLException {
            PreparedStatement ps = connection.prepareStatement(QUERY_STRING);
            ResultSet rs = ps.executeQuery();
            try {
                while (rs.next()) {
                    List<Object> ele = new ArrayList<Object>();
                    //do some processing here
                    //...
                    list.add(ele);
                }
                session.getTransaction().commit();
            } catch (HibernateException he) {
                logger.error(logger.getClass() + he.getMessage() + he.getStackTrace());
                session.getTransaction().rollback();
                throw he;
            } finally {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                if (session.isOpen()) {
                    session.close();
                }
            }
        }
    });
    return list;
}

2 个答案:

答案 0 :(得分:0)

实际上看起来我在那里有一个额外的事务提交。 woops!

答案 1 :(得分:0)

您可以按以下格式关注代码。

Session session = null;
Transaction tx = null;

try{
    session = HibernateUtil.getSessionFactory().openSession();
    tx = session.beginTransaction();
    tx.setTimeout(5);

    //doSomething(session);

    tx.commit();


}catch(RuntimeException e){
    try{
        tx.rollback();
    }catch(RuntimeException rbe){
        log.error("Couldn’t roll back transaction", rbe);
    }
    throw e;
}finally{
    if(session!=null){
        session.close();
    }
}

在Hibernate中,事务管理非常标准,只记得Hibernate抛出的任何异常都是FATAL,你必须立即回滚事务并关闭当前会话。

资源链接:

  1. Hibernate Transaction handle example