標籤:style http color io 使用 java strong sp 檔案
現在我們知道了一個概念Hibernate Session,只有處於Session管理下的POJO才具有持久化操作能力。當應用程式對於處於Session管理下的POJO執行個體執行操作時,Hibernate將這種物件導向的操作轉換成了持久化操作能力。
HIbernate簡要的體繫結構如所示:
通過能夠發現HIbernate需要一個hibernate.properties檔案,該檔案用於配置Hibernate和資料庫連接的資訊。還需要一個XML檔案,該對應檔確定了持久化類和資料表、資料列之間的想對應關係。
除了使用hibernate.properties檔案,還可以採用另一種形式的設定檔: *.cfg.xml檔案。在實際應用中,採用XML設定檔的方式更加廣泛,兩種設定檔的實質是一樣的。
Hibernate的持久化解決方案將使用者從赤裸裸的JDBC訪問中釋放出來,使用者無需關注底層的JDBC操作,而是以物件導向的方式進行持久層操作。底層資料連線的獲得、資料訪問的實現、事務控制都無需使用者關心。這是一種“全面解決”的體繫結構方案,將應用程式層從底層的JDBC/JTA API中抽象出來。通過設定檔來管理底層的JDBC串連,讓Hibernate解決持久化訪問的實現。這種“全面解決”方案的體繫結構圖:
針對以上的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對象。
一. 建立Configuration對象
org.hibernate.cfg.Configuration執行個體代表一個應用程式到SQL資料庫的映射配置,Configuration提供了一個buildSessionFactory()方法,該方法可以產生一個不可變的SessionFactory對象。
你可以直接執行個體化Configuration來擷取一個執行個體,並為它指定一個Hibernate對應檔,如果對應檔在類載入路徑中,則可以使用addResource()方法來添加映射定義檔案。那麼現在的問題就是如何建立Configuration對象呢?
隨著Hibernate 所使用的設定檔的不同,建立Configuration對象的方式也不相同。通常有幾種配置Hibernate的方式:
第一種是使用hibernate.properties檔案作為設定檔。
第二種是使用hibernate.cfg.xml檔案作為設定檔。
第三種是不使用任何的設定檔,以編碼方式來建立Configuration對象。
請注意:Configuration對象的唯一作用就是建立SessionFactory執行個體,所以它才被設計成為啟動期間對象,而一旦SessionFactory對象建立完成,它就被丟棄了。
1. 使用hibernateproperties作為設定檔
對於hibernate.properties作為設定檔的方式,比較適合於初學者。因為初學者往往很難記住該設定檔的格式,以及需要配置哪些屬性。在Hibernate發布包的etc路徑下,提供了一個hibernate.properties檔案,該檔案列出了Hibernate 的所有屬性。每個配置段都給出了大致的注釋,使用者只要取消所需配置段的注釋,就可以快速配置Hibernate和資料庫的連結此處給出使用hibernate.properties檔案建立Configuration對象的方法。
//執行個體化configuration對象Configuration cfg = new Configuration()//多次調用addResource()方法,添加對應檔.addResource("Item.hbm.xml").addResource("Bid.hbm.xml");
查看hibernate.properties檔案發現,該檔案沒有提供Hibernate對應檔的方式。因此使用hibernate.properties檔案來作為設定檔時,必須使用Configuration的.addResource()方法,使用該方法來添加對應檔。
注意:正如上面的代碼所示,使用hibernate.properties檔案配置Hibernate的屬性固然簡單,但是因為要手動添加對應檔,當對應檔極其多時,這是一件非常催人淚下的事情。這也就是在實際開發中,不常使用hibernate.properties檔案作為設定檔的原因。
當然還有另一種添加設定檔的策略,因為對應檔和持久化類是一一對應的,可以通過Configuration對象來添加持久化類,讓Hibernate自己來搜尋對應檔。
//執行個體化configuration對象Configuration cfg = new Configuration)//多次調用addClass()方法,直接添加持久化類.addClass(ppp.Item.class).addClass(ppp.BId.class);
2. 使用hibernate.cfg.xml作為設定檔
前面已經看到使用hibernate.properties作為設定檔的情形。因為hibernate.cfg.xml中已經添加了hibernate的對應檔,採用這種設定檔建立configuration對象執行個體由以下代碼實現:
//執行個體化configuration對象Configuration cfg = new Configuration()//configure()方法將會負責載入hibernate.cfg.xml檔案.configure()
需要注意的是:在通過new關鍵字建立Configuration對象之後,不要忘記調用configure()方法。
二. hibernate.properties和hiberntae.cfg.xml檔案
如果使用etc路徑下的hibernate.properties檔案作為設定檔的模板,修改此模板檔案作為Hibernate設定檔,這種方式的確是快速進入Hibernate開發的方法。但是對於實際開發,通常會使用hibernate.cfg.xml檔案作為設定檔。
深入對比hibernate.properties和hibernate.cfg.xml檔案後看如下的hibernate.properties的一個配置屬性:
//指定資料庫的方言hibernate.dialect org.hibernate.dialect.MySQLDialect
上面的一行代碼是典型的Properties檔案的的格式,前面的key為hibernate.dialect , 後面的value是為org.hibernate.dialect.MySQLDialect。
接下來我們再來查看hibernate.cfg.xml檔案中的相對應的配置代碼:
<property name = "dialect">org.hibernate.dialect.MySQLDialect</property>
同樣指定了Hibernate的Dialect 屬性是org.hibernate.dialect.MySQLDialect 。對比兩種格式的檔案,可以發現雖然格式不同但其實質完全一樣。
Hibernate的設定檔 轉