最近又用到Hibernate了,在执行查询时碰到个“Session is closed!”麻烦,如下:
org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
at org.hibernate.impl.SessionImpl.getPersistenceContext(SessionImpl.java:1850)
at org.hibernate.type.ManyToOneType.scheduleBatchLoadIfNeeded(ManyToOneType.java:142)
at org.hibernate.type.ManyToOneType.hydrate(ManyToOneType.java:128)
at org.hibernate.type.EntityType.nullSafeGet(EntityType.java:227)
at org.hibernate.impl.IteratorImpl.next(IteratorImpl.java:135)
at database.ValidationDAO.find(ValidationDAO.java:35)
at test.testHibe.main(testHibe.java:16)
开始在我的抽象Dao里是这么写的:
protected Iterator find(Class clazz,String user){
Iterator it = null;
try {
startOperation();
Query q=session.createQuery("from "+clazz.getName()+" v where v.user = :user");
q.setParameter("user", user);
it=q.iterate();
tx.commit();
} catch (HibernateException e) {
handleException(e);
} finally {
HibernateFactory.close(session);
}
return it;
}
实例Dao中则是:
public Validation find(String user) {
try {
Iterator it = this.find(Validation.class, user,null);
if(it.hasNext())
return (Validation) it.next();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
在我搜了半天网上资料后,依旧不得解。突然想到改用List而不是Iterator,于是稍微改了下两段代码:
protected List find(Class clazz,String user){
List list = null;
try {
startOperation();
Query q=session.createQuery("from "+clazz.getName()+" v where v.user = :user");
q.setParameter("user", user);
list=q.list();
tx.commit();
} catch (HibernateException e) {
handleException(e);
} finally {
HibernateFactory.close(session);
}
return list;
}
public Validation find(String user) {
try {
List list=find(Validation.class,user);
Iterator it=list.iterator();
if(it.hasNext()){
return (Validation)it.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
没想到,仅仅这样一改竟然就没错误了!百思不得其解……