流程:
读取action然后把List的数据显示到页面上 
 public List findAllCardinfo(String userid, Long cardid) {
Session session = HibernateSessionFactory.getSession();
StringBuffer sb = new StringBuffer();
Transaction tx = null;
Query queryObject = null;
try {
tx = session.beginTransaction();
sb
.append("select new com.telezone.vo.CardinfoVO( cinfo.cardid  ,cinfo.cardname  , oinfo.ownername   ,uinfo.username , cinfo.phonenum,cinfo.cardstate,cinfo.createtime,cinfo.otherinfo ) from Cardinfo as cinfo left  join cinfo.cardownerinfo as oinfo left join cinfo.userinfo as uinfo where uinfo.userid = :uid ");
// Long 类型 cardid 默认取值 0
if (cardid > 0)
sb.append(" and cinfo.cardid = :cid");
sb.append(" order by cinfo.cardid"); queryObject = session.createQuery(sb.toString());
queryObject.setParameter("uid", userid);
if (cardid > 0)
queryObject.setParameter("cid", cardid);
tx.commit();
} catch (RuntimeException re) {
tx.rollback();
log.error("==CardinfoServices findAllCardinfo failed==", re);
re.printStackTrace();
} finally {
session.close();
}
return queryObject.list();
}
把session.close()注释掉就可以了但是session不是用完就需要关闭的吗?
用的是Struts+Hibernate

解决方案 »

  1.   

    finally在return前执行的,所以你是在关闭了session之后才返回,你觉得 这样会有数据么?
    要么把return放在TRY里面,要么在前面定义一个list,然后在try里面list=queryObject.list();才能返回.
      

  2.   

    正解:Hibernate使用了延迟加载Lazy,当你真正使用session的时候才会去执行查询。“queryObject.list();”这句才开始执行后台数据库查询 而你已经在finally中将session关闭你可以去看下hibernate的延迟加载
      

  3.   

    你可以先用个变量把queryObject.list()的结果保存起来,关掉session后再返回这个变量
      

  4.   

    将对象的hbm.xml改成lay=false也是一样的效果吗?
    我试试看
      

  5.   

    写在web.xml中 让session一直开着
    <filter>
    <filter-name>openSession</filter-name>
    <filter-class>
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
    </filter>
    <filter-mapping>
    <filter-name>openSession</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
      

  6.   

    将关联类的class级别lazy也设成false
      

  7.   

    同意4楼,public List findAllCardinfo(String userid, Long cardid) {
            Session session = HibernateSessionFactory.getSession();
            StringBuffer sb = new StringBuffer();
            Transaction tx = null;
            Query queryObject = null;
            List rlist=null;
             try {
                tx = session.beginTransaction();
                sb
                        .append("select new com.telezone.vo.CardinfoVO( cinfo.cardid  ,cinfo.cardname  , oinfo.ownername   ,uinfo.username , cinfo.phonenum,cinfo.cardstate,cinfo.createtime,cinfo.otherinfo ) from Cardinfo as cinfo left  join cinfo.cardownerinfo as oinfo left join cinfo.userinfo as uinfo where uinfo.userid = :uid ");
                // Long 类型 cardid 默认取值 0
                if (cardid > 0)
                    sb.append(" and cinfo.cardid = :cid");
                sb.append(" order by cinfo.cardid");            queryObject = session.createQuery(sb.toString());
                queryObject.setParameter("uid", userid);
                if (cardid > 0)
                    queryObject.setParameter("cid", cardid);
                rlist=queryObject.list();
                tx.commit();
            } catch (RuntimeException re) {
                tx.rollback();
                log.error("==CardinfoServices findAllCardinfo failed==", re);
                re.printStackTrace();
            } finally {
                session.close();
            }
            return rlist;
        }
      

  8.   

    lazy=false或者用open session in view
      

  9.   

    将session绑定你的request这样才能保证你的session在某一次请求中打开状态
      

  10.   

      try {
                tx = session.beginTransaction();
                sb
                        .append("select new com.telezone.vo.CardinfoVO( cinfo.cardid  ,cinfo.cardname  , oinfo.ownername   ,uinfo.username , cinfo.phonenum,cinfo.cardstate,cinfo.createtime,cinfo.otherinfo ) from Cardinfo as cinfo left  join cinfo.cardownerinfo as oinfo left join cinfo.userinfo as uinfo where uinfo.userid = :uid ");
                // Long 类型 cardid 默认取值 0
                if (cardid > 0)
                    sb.append(" and cinfo.cardid = :cid");
                sb.append(" order by cinfo.cardid");            queryObject = session.createQuery(sb.toString());
                queryObject.setParameter("uid", userid);
                if (cardid > 0)
                    queryObject.setParameter("cid", cardid);
      return queryObject.list();            tx.commit();
            } catch (RuntimeException re) {
                tx.rollback();
                log.error("==CardinfoServices findAllCardinfo failed==", re);
                re.printStackTrace();
            } finally {
                session.close();
            }
              }
      

  11.   

    好像是Hibernate会自动帮你完成关闭动作
      

  12.   

    这个问题没有涉及到lazy问题吧 我觉得针对楼主的代码是因为 他把Session关闭了,就相当于我们jdbc中的connection关闭了一样 在去查询queryObject.list() 可定会出错的 
    建议楼主结合Spring 进行配置 或者自己写个过滤器 使用 ThreadLocal 完成 OpenSessionInView
      

  13.   

    首先finally是在return语句之前要执行的,那么finally中session.close();执行以后就会失去数据库连接,query对象的基础就是数据库连接,也是必须的,故出现楼主的结果
      

  14.   

    谢谢各位,我在看看lzy这方面的东西