当前位置: 代码迷 >> J2SE >> HibernateCallback()到底是做什么的呢,新人不是很懂解决方法
  详细解决方案

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

热度:110   发布时间:2016-04-24 12:20:05.0
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();        }    }}
------解决方案--------------------
  相关解决方案