HibernateCallback()到底是做什么的呢,新人不是很懂
、
我见有人说 HibernateCallback()是一个回调方法,在hibernate框架下,对数据库的一种操作
但是我不是很明白 不知道他到底做了些什么 返回些什么,不用会出现什么后果希望懂的人指教
、
我见有人说 HibernateCallback()是一个回调方法,在hibernate框架下,对数据库的一种操作
但是我不是很明白 不知道他到底做了些什么 返回些什么,不用会出现什么后果希望懂的人指教
调试欢乐多
你可以在里面写sql,完全跟jdbc连接数据库代码一样
})
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方法
如果楼主对匿名内部类不了解,最好先看看这方面的知识。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();
}
}
}
其实一般没有这样用 this.getSession()即可获得
但是如果用getSession()的方法直接来操作,这个session不是在spring管理下的。