解决Hibernate session is closed的一种可行性方案
2013-09-03 00:47
323 查看
初学Hibernate的一般都会碰到这个问题,呵呵
下面是查询代码示例。
在这段代码中,调用了
许多人认为一旦调用了close(),一个Session就彻底玩完去见马克思了,错误就在这里发生了,因为调用close后Session还是存在的,只是状态是close,而sessionFactory在检测到有Session存在时,是将现有session作为参数返回的。
以下为避免此问题的一种解决方案,注意,只是一种,这种方法认为一件事做完了,Session理所当然的要见马克思
打开Session,注意这里并不一定是一个全新的Session
我们重写过的close与open方法配合,保证每次都是一个全新的session
下面是查询代码示例。
public Vector<Vector<Object>> handleQuery(String hql, Vector<Object> value) { if(hql == null || hql.equals("")) { return null; } Vector<Vector<Object>> res = new Vector<Vector<Object>>(); Session session = WorkDao.openSession(); Iterator<Work> it = null; Query query = null; if(value == null || value.size() == 0) { it = session.createQuery(hql).iterate(); } else { query = session.createQuery(hql); if(query == null) { return null; } int vs = value.size(); for(int i = 0; i < vs; i++) { Object vi = value.elementAt(i); query.setParameter(i, vi); } it = query.iterate(); } if(it == null) { return null; } while(it.hasNext()) { Work work = it.next(); Vector<Object> row = new Vector<Object>(); row.add(work.getId()); row.add(work.getTaskID()); row.add(work.getTaskType()); row.add(work.getCreateDate()); row.add(work.getTaskCon()); row.add(work.getCompleteStatus()); row.add(work.getCompleteDate()); row.add(work.getTaskRemark()); res.add(row); } WorkDao.closeSession(); if(res == null || res.size() == 0) { return null; } return res; }
在这段代码中,调用了
Session session = WorkDao.openSession();和
WorkDao.closeSession();
许多人认为一旦调用了close(),一个Session就彻底玩完去见马克思了,错误就在这里发生了,因为调用close后Session还是存在的,只是状态是close,而sessionFactory在检测到有Session存在时,是将现有session作为参数返回的。
以下为避免此问题的一种解决方案,注意,只是一种,这种方法认为一件事做完了,Session理所当然的要见马克思
打开Session,注意这里并不一定是一个全新的Session
private static Session openSession() { if(WorkDao.session == null) { WorkDao.session = WorkDao.sessionFactory.openSession(); } return WorkDao.session; }
我们重写过的close与open方法配合,保证每次都是一个全新的session
private static void closeSession() { if(WorkDao.session != null) { WorkDao.session.close(); WorkDao.session = null; } }
相关文章推荐
- org.hibernate.SessionException: Session is closed! 异常解决方法
- atitit. 解决org.hibernate.SessionException Session is closed
- atitit. 解决org.hibernate.SessionException Session is closed
- atitit. 解决org.hibernate.SessionException Session is closed
- hibernate多对一查询session is closed问题
- Session is closed; nested exception is org.hibernate.SessionException: Session is closed解决方案
- ThreadLocal的实现原理,及使用实例,解决spring,hibernate非web项目下的懒加载 no session or session was closed(2)!
- org.hibernate.sessionexception: session is closed
- Session is closed; nested exception is org.hibernate.SessionException: Session is closed解决方案
- org.hibernate.SessionException: Session is closed!
- Hibernate延迟加载 或 no session or session was closed 问题的解决(OpenSessionInViewFilter使用)
- 解决test is not an annotation type一种方案
- failed to lazily initialize a collection of role: no session or session was closed (Hibernate) 解决方法(延迟加载问题)
- 解决Could not open Hibernate Session for transaction; nested exception is java.lang.NoClassDefFoundEr
- 使用clone解决hibernate+spring集成中的延迟加载问题及分析(no session or session was closed)
- 使用Hibernate连接MySQL数据库发生closed.Connection问题的一种解决方法
- Exception in thread "main" org.hibernate.SessionException: Session is closed!
- 出现org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed问题以及解决办法
- 使用clone解决hibernate+spring集成中的延迟加载问题及分析(no session or session was closed)
- SessionFactory or HibernateTemplate is required 的解决办法