爲什麼要使用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實現

發佈了35 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章