最近又用到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; }
没想到,仅仅这样一改竟然就没错误了!百思不得其解……