HibernateCallback()到底是做什么的呢,新人不是很懂

我见有人说  HibernateCallback()是一个回调方法,在hibernate框架下,对数据库的一种操作
但是我不是很明白  不知道他到底做了些什么 返回些什么,不用会出现什么后果希望懂的人指教

解决方案 »

  1.   

    hibernate查询数据库不是要写hql么,用了execute(new HibernateCallback(){
     你可以在里面写sql,完全跟jdbc连接数据库代码一样
    })
      

  2.   

    首先反编译了一下HibernateTemplate的execute方法的源码,不完全正确,但大致意思可以理解public Object execute(HibernateCallback action, boolean exposeNativeSession)
            throws DataAccessException
        {
            Session session;
            boolean existingTransaction;
            FlushMode previousFlushMode;
            session = getSession();
            existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
            if(existingTransaction)
                logger.debug("Found thread-bound Session for HibernateTemplate");
            previousFlushMode = null;
            Object obj;
            try
            {
                previousFlushMode = applyFlushMode(session, existingTransaction);
                enableFilters(session);
                Session sessionToExpose = exposeNativeSession ? session : createSessionProxy(session);
                Object result = action.doInHibernate(sessionToExpose);
                flushIfNecessary(session, existingTransaction);
                obj = result;
            }
            catch(HibernateException ex)
            {
                throw convertHibernateAccessException(ex);
            }
            catch(SQLException ex)
            {
                throw convertJdbcAccessException(ex);
            }
            catch(RuntimeException ex)
            {
                throw ex;
            }
            if(existingTransaction)
            {
                logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
                disableFilters(session);
                if(previousFlushMode != null)
                    session.setFlushMode(previousFlushMode);
            } else
            {
                SessionFactoryUtils.releaseSession(session, getSessionFactory());
            }
            return obj;
            Exception exception;
            exception;
            if(existingTransaction)
            {
                logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
                disableFilters(session);
                if(previousFlushMode != null)
                    session.setFlushMode(previousFlushMode);
            } else
            {
                SessionFactoryUtils.releaseSession(session, getSessionFactory());
            }
            throw exception;
        }主要的就是获得session和释放session,这些操作在增删改查里面都需要,但是每个方法都写这些重复的代码是不是很罗嗦,将这些代码提炼出来,设置成模板的形式,这就是模板设计模式的思想,那么在获session和释放session之间的数据库操作不还得是自己写吗,那么Hibernate就定义了一个接口,然后运行指定接口的方法,即HibernateCallback中的doInHibernate方法
      

  3.   

    HibernateCallback()不是说他是个方法,多和hibernateTemplate.execute(new HibernateCallback(){})一起使用,你差一些api可以知道HibernateCallback是一个接口,j2se的基础告诉我们execute/executeFind(new HibernateCallback(){})中使用了匿名内部类。hibernateTemplate.execute()这个方法需要一个参数对象,这个参数就是实现了HibernateCallback接口的类的对象,你也也可以自定义一个实现了HibernateCallback接口的类,比如A,然后传到execute()方法中execute(new A()),A实现HibernateCallback接口时,必然要实现该接口的doInHibernate(Session session) 方法,在该方法内可以获取道session,这个session通常是外部定义好的session,你只需拿来使用,做你想做的事情,比如分页查询等等。但是A通常都只使用一次,不值得再定义一个类了,所以就使用这个匿名内部类。
    如果楼主对匿名内部类不了解,最好先看看这方面的知识。springj结合hibernate时,没有分页查询的方法,通常使用上述知识自定义分页方法,进行分页查询。
    下面是一个分页查询的例子:
    public static List getListForPage(final String hql, final int offset, final int lengh) {
                   try {
              
                List list = hibernateTemplate.executeFind(new HibernateCallback(){                public Object doInHibernate(Session session)
                            throws HibernateException, SQLException {
                        List list2 = session.createQuery(hql)
                                .setFirstResult(offset)
                                .setMaxResults(lengh)
                                .list();                    
                        return list2;
                    }});
                return list;
            } catch (RuntimeException re) {
                re.printStackTrace();
            }
        }
    }
      

  4.   

    用这个主要是用里面的session 创建sql查询的
    其实一般没有这样用 this.getSession()即可获得
      

  5.   

    关于这个我想说一下的是:hibernateTemplate.executeFind(new HibernateCallback())这种方式session是在spring管理的,一般不会出现session丢失之类的问题
    但是如果用getSession()的方法直接来操作,这个session不是在spring管理下的。