smartzxy 2009-02-28 21:08
浏览 297
已采纳

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;
    }

 

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

 

  • 写回答

1条回答 默认 最新

  • iteye_13779 2009-03-01 02:12
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 ANSYS分析简单钎焊问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开
  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB