日期:2014-05-20 浏览次数:20766 次
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时,没有分页查询的方法,通常使用上述知识自定义分页方法,进行分页查询。
下面是一个分页查询的例子:
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(); } } }
------解决方案--------------------