日期:2014-05-20  浏览次数:20766 次

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

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

希望懂的人指教

------解决方案--------------------
首先反编译了一下HibernateTemplate的execute方法的源码,不完全正确,但大致意思可以理解
Java code

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

------解决方案--------------------
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时,没有分页查询的方法,通常使用上述知识自定义分页方法,进行分页查询。
下面是一个分页查询的例子:

Java code

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

------解决方案--------------------