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