论坛首页 Java版 Hibernate

实现分页时一个session的问题

浏览 2419 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2004-07-29
public class Page {

   /*页面大小*/
   private int pageSize=2;
   /*开始页*/
   private int beginStartPage=1;
   /*记录总数*/
   private long recordCount=0;
   /*页数*/
   private int pageCount=0;
   /*结果对象*/
   private Iterator result;

   public Page() {

   }

   /**
    * @return
    */
   public int getBeginStartPage() {
      return beginStartPage;
   }

   /**
    * @return
    */
   public int getPageSize() {
      return pageSize;
   }

   /**
    * @return
    */
   public long getRecordCount() {
      return recordCount;
   }

   /**
    * @return
    */
   public Iterator getResult() {
      return result;
   }

   /**
    * @param i
    */
   public void setBeginStartPage(int i) {
      beginStartPage = i;
   }

   /**
    * @param i
    */
   public void setPageSize(int i) {
      pageSize = i;
   }

   /**
    * @param l
    */
   public void setRecordCount(long l) {
      recordCount = l;
   }

   /**
    * @param iterator
    */
   public void setResult(Iterator iterator) {
      result = iterator;
   }

    /**
     * 根据记录总数得到页数
     * @param rscount
     */
    public void setPageCountByRS(){
      int the_yu = (int) (this.recordCount % this.pageSize);
      if(the_yu==0){
         setPageCount((int) (this.recordCount/this.pageSize));
      }else{
         setPageCount((int)((this.recordCount-the_yu)/this.pageSize+1));
      }

    }
   /**
    * @return
    */
   public int getPageCount() {
      return pageCount;
   }

   /**
    * @param i
    */
   public void setPageCount(int i) {
      pageCount = i;
   }

}


public static Page listByAll(Page page)throws Exception{
    Session session = Init.sessions.openSession();
    Transaction tx = null;
    Iterator itr = null;
    String queryString = "select u.userno,u.username,u.authority,d.deptname "
                       + "from Users as u,Dept as d where u.deptno=d.deptno";
    try {
      tx = session.beginTransaction();
      Query query = session.createQuery(queryString);

      if(page.getRecordCount()<=0){
        String countRS="select count(*) from Users";
        page.setPageSize(2);
     page.setRecordCount(((Integer) session.iterate(countRS).next()).intValue());//得到总记录数
        page.setPageCountByRS();//根据记录总数和页大小得到可以分多少页
      }
      query.setFirstResult((page.getBeginStartPage()-1)*page.getPageSize());

      query.setMaxResults(page.getPageSize());
      itr = query.iterate();
      page.setResult(itr);
      session.flush();
      tx.commit();
      return page;
    }catch (Exception e){
      tx.rollback();
      e.printStackTrace();
      System.out.println("error in listByAll");
      return null;
    }finally {
      session.close();//如果把这个关闭注释掉一切就正常?为什么啊
    }
  }



public static void main(String args[]) throws Exception {
    UsersBean ub = new UsersBean();
    Page p = new Page();
    Page pg = ub.listByAll(p);
    System.out.print("共"+pg.getPageCount()+"页    ");
    System.out.println("第"+pg.getBeginStartPage()+"页");
    Iterator it = pg.getResult();
    while (it.hasNext()){//
      Object[] u = (Object[])it.next();//在这里出错啊
      String userno =(String)u[0];
      String username =(String)u[1];
      String authority =(String)u[2];
      String deptname =(String)u[3];
      System.out.println(userno+"    "+username+"    "+"    "+authority+"    "+deptname);
    }

}



[ERROR] IteratorImpl - -could not get next result <java.sql.SQLException: 关闭的 Resultset: next>java.sql.SQLException: 关闭的 Resultset: next

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)

at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1130)

at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:196)

at net.sf.hibernate.impl.IteratorImpl.postNext(IteratorImpl.java:63)

at net.sf.hibernate.impl.IteratorImpl.next(IteratorImpl.java:91)

at system.UsersBean.main(UsersBean.java:166)



net.sf.hibernate.LazyInitializationException: Hibernate lazy instantiation problem

at net.sf.hibernate.impl.IteratorImpl.next(IteratorImpl.java:97)

at system.UsersBean.main(UsersBean.java:166)

Caused by: java.sql.SQLException: 关闭的 Resultset: next

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)

at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1130)

at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:196)

at net.sf.hibernate.impl.IteratorImpl.postNext(IteratorImpl.java:63)

at net.sf.hibernate.impl.IteratorImpl.next(IteratorImpl.java:91)

... 1 more

Exception in thread "main"
   
最后更新时间:2004-07-29
谢谢楼上,就是这个了,呵呵!
   
0 请登录后投票
最后更新时间:2004-07-30
我就是有一点疑问:查询干吗还开Transaction?
   
0 请登录后投票
最后更新时间:2004-07-30
引用
我就是有一点疑问:查询干吗还开Transaction?


数据库除了写一致性,还有读一致性问题!你需要选择你的游标策略,例如你是否允许在你iterator的过程其他人删除其中的纪录呢?

当然我也没有仔细想这个问题,还望更多的人发表意见!
   
0 请登录后投票
最后更新时间:2004-08-02
好东西。收藏了。。。谢谢楼主
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐