Hibernate工作原理
來自: http://blog.csdn.net/songsong189/article/details/50781268
首先我們來介紹一下Hibernate是什么,Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用!
那么Hibernate的工作原理是什么呢?
首先我們要知道什么事Hibernate Session,如果Hibernate是一個自來水公司的話那么Session就是一條自來水公司到你家的管道,我們在配置Hibernate的時候我們會寫一個SessionFactory所以一般人是吧Hibernate看成一個Session的一個工廠這個說法我感覺有點差強人意!
針對以上的Hibernate全面解決方案架構圖:
(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的關閉而轉換為脫管狀態。
(5)事務(Transaction):代表一次原子操作,它具有數據庫事務的概念。但它通過抽象,將應用程序從底層的具體的JDBC、JTA和CORBA事務中隔離開。在某些情況下,一個Session 之內可能包含多個Transaction對象。雖然事務操作是可選的,但是所有的持久化操作都應該在事務管理下進行,即使是只讀操作。
(6)連接提供者(ConnectionProvider):它是生成JDBC的連接的工廠,同時具備連接池的作用。他通過抽象將底層的DataSource和DriverManager隔離開。這個對象無需應用程序直接訪問,僅在應用程序需要擴展時使用。
(7)事務工廠(TransactionFactory):他是生成Transaction對象實例的工廠。該對象也無需應用程序的直接訪問。
Hibernate進行持久化操作離不開SessionFactory對象,這個對象是整個數據庫映射關系經過編譯后的內存鏡像,該對象的openSession()方法可打開Session對象。SessionFactory對想是由Configuration對象產生。
每個Hibernate配置文件對應一個configuration對象。在極端情況下,不使用任何配置文件,也可以創Configuration對象。