`
javachikuang
  • 浏览: 72146 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 里 回调函数 HibernateCallback 的理解

阅读更多
在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; 

} 



注意配置文件里applictionContext.xml

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>


<bean id="baseTransactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref bean="transactionManager" />
  </property>
  <property name="transactionAttributes">
  <props>
   <prop key="save*">PROPAGATION_REQUIRED</prop>
   <prop key="update*">PROPAGATION_REQUIRED</prop>
   <prop key="find*">PROPAGATION_REQUIRED</prop>
   <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
  </props>
  </property>
</bean> 

  


  
分享到:
评论

相关推荐

    HibernateCallback使用方法

    HibernateCallback 是 Spring 框架中与 Hibernate 整合的重要组件,通过它可以实现灵活的持久层访问。 在 Hibernate 中,SessionFactory 是一个非常重要的对象,它是单个数据库映射关系编译后的内存镜像。大部分...

    Spring整合hibernate

    例如,你可以通过实现HibernateCallback接口的doInHibernate方法,传入一个回调函数,执行特定的Hibernate操作。此外,HibernateTemplate会自动处理HibernateException,并将其转化为Spring的DataAccessException,...

    Spring整合Hibernate 详解.doc

    通过实现这个接口,可以在执行特定数据库操作前后的回调函数中进行额外的工作,如事务控制、日志记录等。 6.5.6 使用IoC容器组装各种组件 Spring的IoC容器是其核心特性之一,它负责管理应用中的对象及其依赖关系。...

    Spring对DAO的支持.doc

    - **HibernateCallback**:定义了一个回调接口,允许在事务内部执行自定义的Hibernate操作。 通过使用HibernateTemplate,开发者可以专注于业务逻辑,而无需关注底层的SessionFactory和Session管理。 总结来说,...

    使用Spring进行数据访问

    2. **ORM集成**:Spring通过`HibernateTemplate`和`HibernateCallback`支持Hibernate,简化了事务管理和对象关系映射。同样,对于MyBatis,Spring提供`SqlSessionFactoryBean`和`SqlSessionTemplate`来整合MyBatis,...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    spring配置文件详解

    Spring 配置文件详解 Spring 配置文件是 Spring 框架中最重要的配置文件之一,它负责定义和配置应用程序的Bean对象,以及它们之间的依赖关系。Spring 配置文件通常以XML文件的形式存在,文件名通常为...

    Spring3.0新特性

    - **事件监听器的改进**:GenericApplicationListeners 现在只接收特定类型的事件,所有回调接口(如 TransactionCallback 和 HibernateCallback)都声明了一个泛型结果值。 - **任务执行器的增强**:Spring 的 ...

    Spring/泛型Hibernate的实现

    ### 泛型Hibernate的实现与Spring集成 #### 一、泛型Hibernate概念及其实现 在Java开发领域,尤其在企业级应用开发中,Hibernate框架因其强大的对象关系映射(ORM)能力而受到广泛欢迎。泛型Hibernate是利用Java...

    第24次课-1 Spring与Hibernate的整合

    Spring提供了org.springframework.orm.hibernate3.HibernateTemplate类和org.springframework.orm.hibernate3.HibernateCallback接口来方便和Hibernate整合。 HibernateTemplate类封装了Hibernate的主要类,它提供了...

    spring structs hibernate 整合

    此外,Spring还提供了HibernateTemplate和HibernateCallback接口,使得事务管理变得更加简单。在`applicationContext.xml`中,我们需要配置Hibernate的相关bean,如SessionFactory、DataSource等。 对于Struts和...

    Struts+Spring+Hibernate之选课系统

    Spring还支持使用回调机制(如HibernateCallback)处理特殊查询和分页。 Hibernate的核心在于对象关系映射,它允许我们将Java对象直接映射到数据库表。开发者需要正确配置实体类(Entity)和数据访问对象(DAO),...

    Spring基础:数据访问(2)

    - **Hibernate**:Spring通过HibernateTemplate和HibernateCallback接口,提供了对Hibernate的集成,使得我们可以利用Spring的DI和AOP来管理SessionFactory和Session。 - **MyBatis**:Spring支持MyBatis的...

    spring+hibernate详解

    通过`HibernateTemplate`的`execute`方法传入一个实现了`HibernateCallback`接口的对象,可以在回调方法中执行任意的Hibernate操作。 ```java public class PersonDaoImpl extends HibernateDaoSupport implements ...

    Spring学习笔记

    HibernateCallback提供了回调接口,用于执行Hibernate会话操作;HibernateDaoSupport是为数据访问对象提供的支持基类。 15. Struts2与Spring、Hibernate整合: 整合Struts2、Spring和Hibernate可以构建一个Web层、...

    struts2和spring整合

    ### Struts2与Spring框架整合详解 #### 一、整合背景及意义 在现代Web应用开发中,为了更好地实现业务逻辑的分离与组件化管理,通常会采用多种框架结合的方式进行开发。Struts2作为一款优秀的MVC框架,主要用于...

    spring hibernatetemplate

    `TransactionTemplate`是Spring提供的一个事务管理工具,它允许你定义一个回调方法,该方法将在事务环境中执行。使用`TransactionTemplate`,你可以确保所有操作都在同一个事务内,即使在回调方法中包含了多个数据...

    SPRING API 2.0.CHM

    HibernateCallback HibernateDaoSupport HibernateDaoSupport HibernateInterceptor HibernateInterceptor HibernateJdbcException HibernateJdbcException HibernateJpaDialect HibernateJpaVendorAdapter ...

    struts2.3+spring3.1.2+hibernate4.1.6 配置说明

    Struts2、Spring和Hibernate是Java开发中的三大框架,它们的集成能够构建出强大的企业级应用。在这个配置说明中,开发者使用的是Struts2.3、Spring3.1.2和Hibernate4.1.6的版本。 首先,我们需要了解这三大框架的...

Global site tag (gtag.js) - Google Analytics