日期:2014-05-20 浏览次数:20950 次
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();
}
}
}
------解决方案--------------------