初学Hibernate的一般都会碰到这个问题,呵呵
下面是查询代码示例。
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;
}
}