Hibernate核心接口和工做原理html
Hibernate有五大核心接口,分別是:Session 、Transaction 、Query 、SessionFactory 、Configuration 。這五個接口構成了Hibernate運行的基本要素,能夠執行存取,持久化,事務管理等操做。這五個接口能夠位於系統的業務邏輯層和持久化層。下面是一張Hibernate的關係圖:java
(1)SessionFactory:這是Hibernate的關鍵對象,它是單個數據庫映射關係通過編譯後的內存鏡像,它也是線程安全的。它是生成Session的工廠,自己要應用到ConnectionProvider,該對象能夠在進程和集羣的級別上,爲那些事務之間能夠重用的數據提供可選的二級緩存。數據庫
(2)Session:它是應用程序和持久存儲層之間交互操做的一個單線程對象。它也是Hibernate持久化操做的關鍵對象,全部的持久化對象必須在Session的管理下才可以進行持久化操做。此對象的生存週期很短,其隱藏了JDBC鏈接,也是Transaction 的工廠。Session對象有一個一級緩存,現實執行Flush以前,全部的持久化操做的數據都在緩存中Session對象處。緩存
(3)持久化對象:系統建立的POJO實例一旦與特定Session關聯,並對應數據表的指定記錄,那該對象就處於持久化狀態,這一系列的對象都被稱爲持久化對象。程序中對持久化對象的修改,都將自動轉換爲持久層的修改。持久化對象徹底能夠是普通的Java Beans/POJO,惟一的特殊性是它們正與Session關聯着。安全
(4)瞬態對象和脫管對象:系統進行new關鍵字進行建立的Java 實例,沒有Session 相關聯,此時處於瞬態。瞬態實例多是在被應用程序實例化後,還沒有進行持久化的對象。若是一個曾今持久化過的實例,但由於Session的關閉而轉換爲脫管狀態。session
(5)事務(Transaction):表明一次原子操做,它具備數據庫事務的概念。但它經過抽象,將應用程序從底層的具體的JDBC、JTA和CORBA事務中隔離開。在某些狀況下,一個Session 以內可能包含多個Transaction對象。雖然事務操做是可選的,可是全部的持久化操做都應該在事務管理下進行,即便是隻讀操做。app
(6)鏈接提供者(ConnectionProvider):它是生成JDBC的鏈接的工廠,同時具有鏈接池的做用。他經過抽象將底層的DataSource和DriverManager隔離開。這個對象無需應用程序直接訪問,僅在應用程序須要擴展時使用。ide
(7)事務工廠(TransactionFactory):他是生成Transaction對象實例的工廠。該對象也無需應用程序的直接訪問。ui
Hibernate進行持久化操做離不開SessionFactory對象,這個對象是整個數據庫映射關係通過編譯後的內存鏡像,該對象的openSession()方法可打開Session對象。SessionFactory對想是由Configuration對象產生。this
每一個Hibernate配置文件對應一個configuration對象。在極端狀況下,不使用任何配置文件,也能夠建立Configuration對象。
Session接口 Session 接口對於Hibernate 開發人員來講是一個最重要的接口。然而在Hibernate中,實例化的Session是一個輕量級的類,建立和銷燬它都不會佔用不少資源。這在實際項目中確實很重要,由於在客戶程序中,可能會不斷地建立以及銷燬Session對象,若是Session 的開銷太大,會給系統帶來不良影響。可是Session對象是非線程安全的,所以在你的設計中,最好是一個線程只建立一個Session對象。 session能夠看做介於數據鏈接與事務管理一種中間接口。咱們能夠將session想象成一個持久對象的緩衝區,Hibernate能檢測到這些持久對象的改變,並及時刷新數據庫。咱們有時也稱Session是一個持久層管理器,由於它包含這一些持久層相關的操做, 諸如存儲持久對象至數據庫,以及從數據庫從得到它們。須要注意的是,Hibernate的session不一樣於JSP 應用中的HttpSession。當咱們使用session這個術語時,咱們指的Hibernate 中的session,而咱們之後會將HttpSesion 對象稱爲用戶session。
SessionFactroy接口負責初始化Hibernate。它充當數據存儲源的代理,並負責建立Session對象。這裏用到了工廠模式。須要注意的是SessionFactory並非輕量級的,由於通常狀況下,一個項目一般只須要一個SessionFactory就夠,當須要操做多個數據庫時,能夠爲每一個數據庫指定一個SessionFactory。
Transaction接口負責事務相關的操做,通常在Hibernate的增刪改中出現,可是使用Hibernate的人通常使用Spring去管理事務。
Query負責執行各類數據庫查詢。它可使用HQL語言或SQL語句兩種表達方式。它的返回值通常是List。須要本身轉換。
Configuration對象用於配置並根啓動Hibernate。Hibernate應用經過Configuration實例來指定對象—關係映射文件的位置或者動態配置Hibernate的屬性,而後建立SessionFactory實例。咱們能夠查看Configuration的源代碼,它的configure()方法是這樣實現的:
咱們看到它是在這裏指定了ORM文件的位置,這就是爲何Hibernate老是默認到classpath下去尋找hibernate.cfg.xml文件的緣由了。實際上咱們還能夠經過configure(String resource)來動態的指定配置文件,只不過一般咱們都是採用的默認設置罷了。這樣的話咱們的配置文件就都被讀取了,同時配置文件中經過<mapping>元素引入的映射文件也被讀取了。
1.經過Configuration().configure();讀取並解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>讀取並解析映射信息
3.經過config.buildSessionFactory();//建立SessionFactory
4.sessionFactory.openSession();//打開Sesssion
5.session.beginTransaction();//建立事務Transation
6.persistent operate持久化操做 //通常指Save這個方法
7.session.getTransaction().commit();//提交事務
8.關閉Session
9.關閉SesstionFactory
hibernate.properties和hiberntae.cfg.xml文件
若是使用etc路徑下的hibernate.properties文件做爲配置文件的模板,修改此模板文件做爲Hibernate配置文件,這種方式的確是快速進入Hibernate開發的方法。可是對於實際開發,一般會使用hibernate.cfg.xml文件做爲配置文件。
深刻對比hibernate.properties和hibernate.cfg.xml文件後看以下的hibernate.properties的一個配置屬性:
<span style="font-family:SimSun;font-size:14px;">//指定數據庫的方言 hibernate.dialect org.hibernate.dialect.MySQLDialect</span>
上面的一行代碼是典型的Properties文件的的格式,前面的key爲hibernate.dialect , 後面的value是爲org.hibernate.dialect.MySQLDialect。
接下來咱們再來查看hibernate.cfg.xml文件中的相對應的配置代碼:
<span style="font-family:SimSun;font-size:14px;"><property name = "dialect">org.hibernate.dialect.MySQLDialect</property></span>
一樣指定了Hibernate的Dialect 屬性是org.hibernate.dialect.MySQLDialect 。對比兩種格式的文件,能夠發現雖然格式不一樣但其實質徹底同樣。