HibernateTemplate中HibernateCallback的事务 为什么需要使用HibernateCallback

1.this.getSession() 是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,它可以从当前事务或者一个新的事务获得一个hibernate session,需要程序维护session(手动关闭session)

2.this.getHibernateTemplate().getSessionFactory().getCurrentSession()/openSession()则从spring中获取session
getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。
采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭

 


3.通过new HibernateCallback(){XXX}获得的session是当前线程中的session

4.hibernateTemplate会确保当前hibernate的session对象的正确打开和关闭,并直接参与到事物管理中去,template实例不仅是线程安全的同时也是可重用的

5.不提倡用getSession()来获得session实现,因为这样拿到的session是hibernate最原始的session不享有spring提供的模板支持需要手动的关闭session,可以使用new HibernateCallback(){xxx}得到session

6.回调这个东西历史很久了。我的记忆中C的windows编程中就有了。
基本原理跟好莱坞原则一样,Don't call me,I'll call you.
编程上来说,一般使用一个库或类时,是你主动调用人家的API,这个叫Call,有的时候这样不能满足需要,需要你注册你自己的程序(比如一个对象),然后让人家在合适的时候来调用你,这叫Callback。设计模式中的Observer就是例子。基于事件的编程方式,比如经典的VB、Delphi里用的,那些事件的处理程序都是被调用的方法,都可成为回调(Callback)方法。

7.一个回调实现能够有效地在任何Hibernate数据访问中使用。HibernateTemplate 会确保当前Hibernate的 Session 对象的正确打开和关闭,并直接参与到事务管理中去。 Template实例不仅是线程安全的,同时它也是可重用的。因而他们可以作为外部对象的实例变量而被持有。对于那些简单的诸如find、load、 saveOrUpdate或者delete操作的调用,HibernateTemplate 提供可选择的快捷函数来替换这种回调的实现。不仅如此,Spring还提供了一个简便的 HibernateDaoSupport 基类,这个类提供了 setSessionFactory(..) 方法来接受一个 SessionFactory 对象,同时提供了 getSessionFactory() 和 getHibernateTemplate() 方法给子类使用。综合了这些,对于那些典型的业务需求,就有了一个非常简单的DAO实现

 

 

另外再附上另一位仁兄的博文:

 

HibernateTemplate中HibernateCallback的事务

link: http://www.blogjava.net/caixuetao/archive/2007/04/26/113433.html

 

 

你可能感兴趣的:(spring,编程,Hibernate,session,callback,Delphi)