Hibernate實戰讀書摘要(1)—理解對象/關係持久化

1、構建SessionFactory

這是一個典型的Hibernate啓動過程的例子,在一行代碼中,使用自動的配置文件偵測:

SessionFactory sessionFactory = new Confiruration()
                       .configure()
                       .buildSessionFactory();


Hibernate怎麼知道配置文件放置的位置,以及要加載哪個配置文件呢?

可以把Configuration當作Hibernate配置文件(或者屬性文件)的一個對象表示法。

調用new Configuration()時,Hibernate在classpath的根目錄下搜索名爲hibernate.properties的文件。如果找到了,所有hibernate.*屬性都會被加載並添加到Configuration對象。

調用configure()時,HIbernate在classpath的根目錄下搜索名爲hibernate.cfg.xml的文件,如果無法找到就會拋出一個異常。當然,如果你沒有這個配置文件,就不一定要調用這個方法。如果XML配置文件中的設置與較早設置的屬性完全相同,XML設置就覆蓋前面的設置。

hibernate.properties配置文件的位置始終在classpath的根目錄中,處在任何包之外。如果要使用一個不同的文件,或者要Hibernate在classpath的子目錄中查找XML配置文件,就必須把路徑當作configure()方法的一個實參進行傳遞:

SessionFactory sessionFactory = new Configuration()
                         .configure("/persistence/auction.cfg.xml")
                         .buildSessionFactory();

最後,在創建SessionFactory之前,你始終可以在Configuration對象中編程式的設置額外的配置選項或者映射文件位置:

SessionFactory sessionFactory = new Configuration()
                         .configure("/persistence/auction.cfg.xml")
                         .setProperty(Environment.DEFAULT_SCHEMA, "CAVEATEMPTPR")
                         .addResource("aucton/CreditCard.hbm.xml")
                         .buildSessionFactory();

許多配置源在這裏得到應用:首先讀取classpath中的Hibernate.properties文件(如果有的話)。接下來,添加來自/persistence/auction.cfg.xml的所有設置,並覆蓋以前應用的任何設置。最後,通過編程設置另一個配置屬性(默認的數據庫Schema名稱),並且添加另一個HIbernate XML映射元數據文件到配置中。

當然,可以通過編程設置所有選項,或者在不同的XML配置文件之間切換,得到不同的部署數據庫。對於如何配置和部署Hibernate,實際上並沒有限制;最後,只需要從一個準備好的配置中創建SessionFactory。

在大部分Hibernate應用程序中,SessionFactory應該在應用程序初始化期間被實例化一次。然後單獨的實例應該爲特定程序中的所有代碼所用,任何Session都應該用這個單獨的SessionFactory來創建。SessionFactory是線程安全的,且能夠被共享;Session是個單線程的對象。

2、數據庫連接

可以提供自己的連接嗎?實現org.hibernate.connection.ConnnectionProvider接口,用hibernate.connection.provider_class配置選項命名你的實現。現在,如果Hibernate需要數據庫連接,它將依賴於你定製的提供程序(provider)。

3、使用Hibernate EntityManager

Hibernate EntityManager是圍繞提供JPA編程接口的Hibernate Core的一個包裝,支持JPA實體實例的生命週期,並允許你用標準的Java Persistence查詢語言編寫查詢。

JPA規範也定義編程接口、持久化對象的生命週期規則和查詢特性。JPA這部分的Hibernate實現可被用作Hibernate EntityManager,這是另一個可以堆在Hibernate Core頂部的可選模塊。當需要簡單的Hibernate接口或者甚至需要JDBC連接時,可以退回。Hibernate原生的特性在各個方面都是JPA持久化的一個超集。(簡單的事實就是,Hibernate EntityManager是對提供JPA兼容性的Hibernate Core的一個小包裝。)

使用標準化的接口和標準化的查詢語言有個好處:可以使用任何EJB 3.0兼容應用程序服務器執行JPA兼容的持久層。或者,可以在簡單的Java中任何特定的標準運行時環境之外使用JPA(這是Hibernate Core可以被用在任何地方的真正含義)。

Hibernate Annotations應該與Hibernate EntityManager結合考慮。如果你針對JPA接口使用JPA編寫應用程序代碼,而沒有用JPA註解創建大部分映射,這是不正常的。

Hibernate也是JBoss應用程序服務器(JBoss AS)的一部分,是J2EE 1.4和Java EE 5.0的一個實現。Hibernate Core、Hibernate Annotations和Hibernate EntityManager結合起來,形成了這個應用服務器的持久話引擎。因此,可以獨立使用每件東西,也可以在應用服務器內部使用並享有所有EJB 3.0的益處,例如會話bean、消息驅動的bean和其他的Java EE服務。

如你所見,原生的Hibernate特性實現了規範的重要部分,或者是必要時提供額外功能的自然的供應商擴展。

有個簡單的技巧,可以立即知道正在看的代碼是JPA還是原生的Hibernate。如果只看見有javax.persistence.*導入,就是正處在規範內工作;如果也導入org.hibernate.*,就是正在使用原生的Hibernate功能。

SessionFactory在Hiibernate應用程序中表示一個特定的邏輯數據存儲配置。EntityManager Factory在JPA應用程序中扮演這同樣的角色,你用配置文件或者在應用程序代碼中配置EntityManager Factory(EMF),就像配置SessionFactory一樣。EMF的配置,與一組映射元數據(通常是被註解的類)一起,被稱作持久化單元(persistence unit)

這些是Java Persistence中主要的編程接口:

javax.persistence.Persistence——給EntityManagerFactory的創建提供一種靜態方法的一個啓動類

javax.persistence.EntityManagerFactory——等同於Hibernate SessionFactory。這個運行時對象表示一個特定的持久化單元。它是線程安全的,通常被當作一個單例(singleton)處理,並給EntityManager實例的創建提供方法。

javax.persistence.EntityManager——等同於Hibernate Session。這個單線程、非共享的對象表示數據訪問的一個特定工作單元。它提供方法去管理實體實例的生命週期並創建Query實例。

javax.persistence.Query——等同於Hibernate Query。一個對象是一種特定的JPA查詢語言或者原生的SQL查詢表示法,它允許參數的安全綁定,並給查詢的執行提供個總各樣的方法。

javax.persistence.EntityTransaction——等同於Hibernate Transaction,在Java SE環境中用於RESOURCE_LOCAL事務的劃分。在Java EE中,依賴JTA標準的javax.transaction.UserTransaction接口進行編程式的事務劃分。

4、如何使用帶有Hibernate的幾個數據庫

如果要使用幾個數據庫,就創建幾個配置文件,每個數據庫都分配它自己的SessionFactory,並且從不同的Configuration對象中構建幾個SessionFactory實例。每個Session都從任何SessionFactory中打開,在JNDI中查找託管數據源。現在協調這些資源就是事務和資源管理器的責任了——Hibernate只在這些數據庫連接上執行SQL語句。事務範圍用JTA進行編程式地設置,或者由包含EJB的容器和一個聲明的集合來處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章