Hibernate疑惑

 

最近又用到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;
    }

 

没想到,仅仅这样一改竟然就没错误了!百思不得其解……

 

貌似query.iterator,和query.list采用了不同的实现?我猜测list可能是一次读取,而iterator是多次读取的,当时,你在一次读取后讲事务提交了(sesssion也就关闭了),当时iterator继续迭代时,事务已经提交,无法再打开.我的看法是这样的,如有不对,请指正!