学习了spring的HibernateTemplate类部分源码,总结一下自己对回调模式的理解。
在dao里经常有这样的语句
public E findById(Serializable id)
{
return (E) getHibernateTemplate().get(clazz, id);
}
HibernateTemplate类源码
public Object get(Class entityClass, Serializable id) throws DataAccessException {
return get(entityClass, id, null);
}
public Object get(final Class entityClass, final Serializable id, final LockMode lockMode)
throws DataAccessException {
return execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
if (lockMode != null) {
return session.get(entityClass, id, lockMode);
}
else {
return session.get(entityClass, id);
}
}
}, true);
}
public Object execute(HibernateCallback action) throws DataAccessException {
return execute(action, isExposeNativeSession());
}
public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Session session = getSession();
boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
if (existingTransaction) {
logger.debug("Found thread-bound Session for HibernateTemplate");
}
FlushMode previousFlushMode = null;
try {
previousFlushMode = applyFlushMode(session, existingTransaction);
enableFilters(session);
Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));
Object result = action.doInHibernate(sessionToExpose); flushIfNecessary(session, existingTransaction);
return result;
}
catch (HibernateException ex) {
throw convertHibernateAccessException(ex);
}
catch (SQLException ex) {
throw convertJdbcAccessException(ex);
}
catch (RuntimeException ex) {
// Callback code threw application exception...
throw ex;
}
finally {
if (existingTransaction) {
logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
disableFilters(session);
if (previousFlushMode != null) {
session.setFlushMode(previousFlushMode);
}
}
else {
// Never use deferred close for an explicitly new Session.
if (isAlwaysUseNewSession()) {
SessionFactoryUtils.closeSession(session);
}
else {
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
}
}
}
}
HibernateTemplate类是对hibernate操作的封装。如果要自己写hibernate的操作,最麻烦的是那些要检查的错误,而且每一个地方都一样。不一样的地方只是真正对数据库操作的语句。spring的想法是一样的代码抽取出来写成一个HibernateTemplate中的execute方法。execute的方法参数是HibernateCallback接口类。HibernateCallback里面定义了一个doInHibernate的方法。因为这个方法是变的。比如你是查找数据方法应该就是:session.load()。删除数据就是session.delete().这样的话查询数据库的方法用execute方法。
HibernateCallback 接口类
public interface HibernateCallback {
Object doInHibernate(Session session) throws HibernateException, SQLException;
}
然后使用内部类的形式把HibernateCallback中的方法doInHibernate实例化。
new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
if (lockMode != null) {
return session.get(entityClass, id, lockMode);
}
else {
return session.get(entityClass, id);
}
}
总的想法就是不变的东西可以抽象出一个方法。比如对异常的检查。变的东西,比如对数据库的操作,抽象出一个接口的方法。
总结
JAVA的CALLBACK通过接口来实现。
例:
1.HibernateTemplate,内联类
2.内联类实现接口HibernateCallback的doInHibernate 方法
3.HibernateTemplate拥有一个参数为HibernateCallback接口类型的函数execute(HibernateCallback action)方法.
4.调用HibernateTemplate的get方法时,将内联类传给了excute方法
5.执行excute方法时,(
你调用它)
已取得内联类,就可以随时回调它所实现的HibernateCallback接口中的方法了,
这时它反过来调用你的方法(
它调用你),这就是回调了.
Javaeye两个会员的理解,我觉得比较到位.
冉翔:
就是调用系统的一个方法,传进去一个接口的实现类 or 匿名类。
然后系统的方法调用接口申明的方法,并且注入相应的参数
Buaawhl:
IoC, Functor, Visitor 都是 callback。
就是一个 Template Methond 里面的flow不变,某一个步骤的具体操作变化,这个变化部分需要从外部(参数,或者属性,或者 override parent method)注入。
类似于从前的 C 回调函数指针。
MainFlow ( callback ){
step1;
....
callback( someThing );
....
stepN;
}
分享到:
相关推荐
// 回调 callback.doInHibernate(s); s.getTransaction().commit(); } catch (Exception e) { s.getTransaction().rollback(); } finally { s.close(); s = null; } } private Session getSession() { ...
### hibernateTemplate的常用方法详解 #### 概述 `HibernateTemplate`是Spring框架中用于操作Hibernate的一个便捷工具类,它极大地简化了Hibernate在实际应用中的集成与开发工作。通过`HibernateTemplate`,开发者...
通过上述介绍可以看出,HibernateTemplate为开发者提供了一个高效、简洁的方式来操作Hibernate,大大降低了学习曲线和开发难度。在实际应用中,合理利用这些功能,可以有效提升开发效率和代码质量。
该方法提供了两个重载方法,可以根据需要指定锁模式。 deleteAll 方法 deleteAll 方法用于删除所有给定的持久化实例。 enableFilter 方法 enableFilter 方法用于启用 Hibernate Filter,用于过滤查询结果。 ...
通过本文的介绍,我们不仅了解了`HibernateTemplate`的核心功能,还通过具体的示例代码深入学习了其在实际项目中的应用方式。希望本文能帮助读者更好地理解和掌握`HibernateTemplate`的使用技巧。
// 执行回调操作 try { return action.doInHibernate(session); } catch (HibernateException ex) { // 处理Hibernate异常 throw convertHibernateAccessException(ex); } } ``` - **getSessionFactory**...
HibernateTemplate的简单示例
### HibernateTemplate 的详细介绍与使用范围 #### 一、概述 在Spring框架中,`HibernateTemplate`作为ORM(Object Relational Mapping)技术中的一个重要组件,它提供了简化Hibernate操作的方法集,使得开发人员...
《轻量级 J2EE 企业应用实战: Struts+Spring+Hibernate 整合开发》一书中详述了Spring与Hibernate的整合,其中一个重要组件就是HibernateTemplate。它为简化Hibernate在Spring框架中的使用提供了便利,减少了手动...
- **功能**:执行指定的回调方法,并返回其结果。 - **示例代码**: ```java template.execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, ...
### 关于使用HibernateTemplate #### 一、简介与背景 在Java企业级应用开发中,持久层技术扮演着至关重要的角色。其中,Hibernate作为一款优秀的ORM(Object Relational Mapping)框架,极大地简化了数据访问层的...
在IT领域的软件开发中,尤其是基于Java的企业级应用开发中,Hibernate作为一个强大的对象关系映射(ORM)...开发者应熟练掌握这一技巧,并结合具体的应用场景,合理运用参数设置和异常处理策略,以达到最佳的性能表现。
hibernateTemplate常用方法.htm
模型-视图-控制器)架构以及Hibernate的持久化技术完美地结合在一起,为开发者提供了一种高效、灵活的开发模式。在实际项目中,我们经常需要处理大量的数据,此时分页功能显得尤为重要。 分页功能在SSH框架中实现...
它基于Hibernate的配置信息(如hibernate.cfg.xml)初始化,并在整个应用生命周期内保持单例模式。 2. HibernateTemplate:这是Spring提供的一个辅助类,它封装了SessionFactory的一些常用操作,如保存、更新、删除...
GenericHibernateDao 继承 HibernateDao,简单封装 HibernateTemplate 各项功能,简化基于Hibernate Dao 的编写。
本文将详细介绍如何利用HibernateTemplate结合SQL查询来实现这一功能。 #### 二、核心概念解释 1. **HibernateTemplate**:是Spring框架提供的用于简化Hibernate使用的模板类。它提供了大量操作数据库的方法,包括...
但是,如果在`HibernateTemplate`的`execute`方法中手动调用了`session.flush()`,那么这个事务就会被立即提交,而不是等待整个回调方法执行完毕。因此,如果需要确保多个操作都在同一个事务中,开发者需要自己控制...
### HibernateTemplate类的使用详解 #### 一、引言 在Java开发中,持久层框架Hibernate因其优秀的ORM(Object-Relational Mapping)特性被广泛应用。为了更便捷地使用Hibernate,Spring框架提供了一系列工具类来简化...