1 getCurrentSession建立的session會和綁定到當前線程,而openSession不會。sql
2 getCurrentSession建立的線程會在事務回滾或事物提交後自動flush,自動關閉,而openSession必須手動flush,關閉。數據庫
使用getCurrentSession有什麼好處?設計模式
getCurrentSession()的功能要從ThreadLocal類提及,ThreadLocal是一個線程做用範圍的對象,就是說保存在他中的對象的生命週期是一個線程,Spring調用該方法後會將打開的Session放入ThreadLocal中進行保存,而後經過getCurrentSession()方法返回保存的Session對象,這樣在一次請求(一個線程)中調用getCurrentSession()就都會從ThreadLocal中取出保存的Session對象,這樣就保障了一次請求(一個線程)中使用的都是同一個Session對象了,能夠保障事務操做的特性,像數據一致性和數據安全性(session不是線程安全的)等。緩存
1》Configuration接口的做用是對Hibernate進行配置,以及對它進行啓動。在Hibernate的啓動過程當中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,而後建立一個SessionFactory對象。安全
2》這裏用到了一個設計模式――工廠模式,用戶程序從工廠類SessionFactory中取得Session的實例。
令你感到奇怪的是SessionFactory並非輕量級的!實際上它的設計者的意圖是讓它能在整個應用中共享。典型地來講,一個項目一般只須要一 個SessionFactory就夠了,可是當你的項目要操做多個數據庫時,那你必須爲每一個數據庫指定一個SessionFactory。
SessionFactory在Hibernate中實際起到了一個緩衝區的做用,它緩衝了Hibernate自動生成的SQL語句和一些其它的映射數據,還緩衝了一些未來有可能重複利用的數據。 session
3》Session接口對於Hibernate 開發人員來講是一個最重要的接口。然而在Hibernate中,實例化的Session是一個輕量級的類,建立和銷燬它都不會佔用不少資源。這在實際項目 中確實很重要,由於在客戶程序中,可能會不斷地建立以及銷燬Session對象,若是Session的開銷太大,會給系統帶來不良影響。但值得注意的是 Session對象是非線程安全的,所以在你的設計中,最好是一個線程只建立一個Session對象。
在Hibernate的設計者的頭腦中,他們將session看做介於數據鏈接與事務管理一種中間接口。咱們能夠將session想象成一個持久對象 的緩衝區,Hibernate能檢測到這些持久對象的改變,並及時刷新數據庫。咱們有時也稱Session是一個持久層管理器,由於它包含這一些持久層相 關的操做,諸如存儲持久對象至數據庫,以及從數據庫從得到它們。 線程
對於session一級緩存的說法:設計
Hibernate中的Session是一級緩存,能夠理解爲線程的緩存,在線程運行期間一直存在。對象
session能夠理解爲一個能夠操做數據庫的對象,該對象中有操做數據庫的方法,而且session能夠存儲要發送給DB的sql語句,緩存從DB中已經查出來的數據等。接口
在Java裏面,緩存一般是指Java對象的屬性佔用的內存空間,一般是一些集合類型的屬性。在Session接口的實現類SessionImpl中定義了一系列的Java集合,這些Java集合就構成了Session的緩存。