Hibernate實現ORM:簡介及背景
ORM(Object/Relation Mapping)是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。 簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將Java程序中的對象自動持久化到關系數據庫中。本質上就是將數據從一種形式轉換到另外一種形式。 雖然同時暗示者額外的執行開銷;但是如果ORM作為一種中間件實現,則會有很多機會做優化,而這些在手寫的持久層并不存在。 更重要的是用于控制轉換的元數據需要提供和管理;但是同樣,這些花費要比維護手寫的方案要少;而且就算是遵守ODMG (Object Data Management Group )規范的對象數據庫依然需要類級別的元數據(Meta Data)。
ORM是隨著面向對象的軟件開發方法發展而產生的。面向對象的開發方法是當今企業級應用開發環境中的主流開發方法,關系數據庫是企業級應用環境中永久存放數據的主流數據存儲系統。對象和關系數據是業務實體的兩種表現形式,業務實體在內存中表現為對象,在數據庫中表現為關系數據。內存中的對象之間存在關聯和繼承關系,而在數據庫中,關系數據無法直接表達多對多關聯和繼承關系。因此, ORM系統一般以中間件的形式存在,主要實現程序對象到關系數據庫數據的映射。
使用ORM的元數據描述對象與數據庫間的映射,可以提高系統的開發效率和系統性能,具有可維護性和廠家獨立性。Hibernate作為ORM框架的典型代表具有成熟、流行、功能強大的優點。并逐漸發展成Java 持久層事實上的標準。
在OOD(Object-Oriented Design)中我們用對象來描述真實世界,但在關系數據庫還是數據的常用永久存儲技術背景下,我們需要一種有效技術來完成對象到關系數據的轉化(即對象的持久化)。而對象之間有許多關系數據無法表達的概念,如關聯和繼承等。如果直接通過JDBC來開發自己的持久化層很有可能影響項目的進度和持久層的可靠性,并嚴重影響代碼的可維護性。
Hibernate是一種運用DAO(Data Access Object)設計模式來實現對象和關系數據庫之間映射(O/R Mapping)的開源框架。它對JDBC進行了輕量級的對象封裝,使得Java程序員可以完全使用面向對象的編程思維來操作關系數據庫,是持久層的一項實現技術。相比于其它持久層實現技術如JDBC、EJB(Entity Beans)、JDO(Java Data Object)等,Hibernate易于掌握,更加符合編程人員的面向對象思維,Hibernate擁有自己的一種查詢語言(HQL),它是完全面向對象的。
Hibernate通過創建與數據庫中的表對應的持久化對象,然后再通過影射文件將持久化對象中的屬性與數據庫表中的字段對應起來。為Java 程序員提供了面向對象的API和接口來操縱數據庫,從而避免了在業務邏輯中嵌入大量的JDBC訪問和事物控制代碼。Hibernate運行時的結構如下圖。
其中,SessionFactory保存了對當前數據庫配置的所有映射關系,它是將某個數據庫的映射關系經過編譯之后全部保存在內存中的。它還是生成Session的工廠,它在進行實例化的過程中將會用到ConnectionProvider。一個SessionFactory對應一個數據庫連接,當數據庫連接改變時需要修改SessionFactory 。Session是進行持久化操作的基礎,所有的持久化操作都是在Session的基礎上進行的。它相當與JDBC中的Connection。它是Hibernate的持久化管理器的核心,提供了一系列的持久化操作方法。另外,它還持有一個針對持久化對象的一級緩存,在遍歷持久化對象或者根據持久化標識查找對象的時候會用到。Transaction在功能上和數據庫中的事務完全一樣,通過它實現對數據庫中事務的控制。Transaction對象是Session對象產生的,所以他的生命周期比Session短。一個Session的生命周期中可以有多個Transaction對象。ConnectionProvider的主要作用是生成與數據庫建立了連接的JDBC對象,同時他還作為數據庫連接的緩沖池。通過ConnectionProvider實現了應用程序和底層的DataSource和DriverManager的隔離。TransactionFactory:是生成Transaction對象的工廠,通過TransactionFactory實現了事務的封裝,使其具體的實現方法與應用程序無關。
Hibernate作為持久層的主流框架,不僅可以應用在桌面應用程序開發,也可以用在WEB應用程序的開發。從前面的分析可以看出,Hibernate使用數據庫和配置信息來為應用程序提供持久化服務(以及持久的對象)。系統使用的Hibernate的是一個全面的體系結構,將應用層從底層的JDBC(Java Data Base Connectivity)/JTA(Java Transaction API)/JNDI(Java Naming and Directory Interface)中抽象出來,而讓Hibernate來處理這些細節。



















