Hibernate概述
本文假定讀者已經(jīng)熟知以下知識(shí)
能夠熟練使用JDBC創(chuàng)建Java應(yīng)用程序;
創(chuàng)建過以數(shù)據(jù)庫為中心的應(yīng)用
理解基本的關(guān)系理論和結(jié)構(gòu)化查詢語言SQL (Strutured Query Language)
Hibernate
Hibernate是一個(gè)用于開發(fā)Java應(yīng)用的對(duì)象/關(guān)系映射框架。它通過在數(shù)據(jù)庫中為開發(fā)人員存儲(chǔ)應(yīng)用對(duì)象,在數(shù)據(jù)庫和應(yīng)用之間提供了一座橋梁,開發(fā)人員不必編寫大量的代碼來存儲(chǔ)和檢索對(duì)象,省下來的精力更多的放在問題本身上。
持久化與關(guān)系數(shù)據(jù)庫
持久化的常見定義:使數(shù)據(jù)的存活時(shí)間超過創(chuàng)建該數(shù)據(jù)的進(jìn)程的存活時(shí)間。數(shù)據(jù)持久化后可以重新獲得它;如果外界進(jìn)程沒有修改它,它將與持久化之前相同。對(duì)于一般應(yīng)用來說,持久化指的是將數(shù)據(jù)存儲(chǔ)在關(guān)系數(shù)據(jù)庫中。
關(guān)系數(shù)據(jù)庫是為管理數(shù)據(jù)而設(shè)計(jì)的,它在存儲(chǔ)數(shù)據(jù)方面很流行,這主要?dú)w功于易于使用SQL來創(chuàng)建和訪問。
關(guān)系數(shù)據(jù)庫使用的模型被稱為關(guān)系模型,它使用二維表來表示數(shù)據(jù)。這種數(shù)據(jù)邏輯視圖表示了用戶如何看待包含的數(shù)據(jù)。表可以通過主碼和外碼相互關(guān)聯(lián)。主碼唯一的標(biāo)識(shí)了表中的一行,而外碼是另一個(gè)表中的主碼。
對(duì)象/關(guān)系阻抗不匹配
關(guān)系數(shù)據(jù)庫是為管理數(shù)據(jù)設(shè)計(jì)的,它適合于管理數(shù)據(jù)。然而,在面向?qū)ο蟮膽?yīng)用中,將對(duì)象持久化為關(guān)系模型可能會(huì)遇到問題。這個(gè)問題的根源是因?yàn)殛P(guān)系數(shù)據(jù)庫管理數(shù)據(jù),而面向?qū)ο蟮膽?yīng)用是為業(yè)務(wù)問題建模而設(shè)計(jì)的。由于這兩種目的不同,要使這兩個(gè)模型協(xié)同工作可能具有挑戰(zhàn)性。這個(gè)問題被稱為 對(duì)象/關(guān)系阻抗不匹配(Object/relational impedance mismatch)或簡(jiǎn)稱為阻抗不匹配
阻抗不匹配的幾個(gè)典型方面
在應(yīng)用中輕易實(shí)現(xiàn)的對(duì)象相同或相等,這樣的關(guān)系在關(guān)系數(shù)據(jù)庫中不存在。
在面向?qū)ο笳Z言的一項(xiàng)核心特性是繼承,繼承很重要,因?yàn)樗试S創(chuàng)建問題的精確模型,同時(shí)可以在層次結(jié)構(gòu)中自上而下的共享屬性和行為。而關(guān)系數(shù)據(jù)庫不支持繼承的概念。
對(duì)象之間可以輕易的實(shí)現(xiàn)一對(duì)一,一對(duì)多和多對(duì)多的關(guān)聯(lián)關(guān)系,而數(shù)據(jù)庫并不理解這些,它只知道外碼指向主碼。
對(duì)象/關(guān)系映射
前頁列舉了一些阻抗不匹配的問題,當(dāng)然開發(fā)人員是可以解決這些問題,但這一過程并不容易。對(duì)象/關(guān)系映射(Object/Relational Mapping)就是為解決這些問題而開發(fā)的。
ORM在對(duì)象模型和關(guān)系模型之間架起了一座橋梁,讓應(yīng)用能夠直接持久化對(duì)象,而不要求在對(duì)象和關(guān)系之間進(jìn)行轉(zhuǎn)換。Hibernate就是ORM工具中最成功的一種。它的主要優(yōu)點(diǎn)是簡(jiǎn)單,靈活,功能完備和高效。
Hibernate的優(yōu)點(diǎn)之一:簡(jiǎn)單
Hibernate不像有些持久化方案那樣需要很多的類和配置屬性,它只需要一個(gè)運(yùn)行階段配置文件已經(jīng)為每個(gè)要持久化的應(yīng)用對(duì)象指定一個(gè)XML格式的映射文件。
映射文件可以很短,讓框架決定映射的其它內(nèi)容,也可以通過制定額外的屬性,如屬性的可選列名,向框架提供更多信息。如右就是一個(gè)映射文檔的示例。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.auction">
<class name="com.sitinspring.domain.User"
table="USERTABLE_OKB" lazy="false">
<id name="id" column="ID" >
<generator class="uuid.hex"/>
</id>
<property name="name" column="name" />
<property name="password" column="pswd" />
<property name="email" column="email" />
<property name="lastLoginTime" column="lastLoginTime" />
<property name="lastLoginIp" column="lastLoginIp" />
</class>
</hibernate-mapping>
Hibernate的優(yōu)點(diǎn)之二:功能完備
Hibernate支持所有的面向?qū)ο筇匦裕ɡ^承,自定義對(duì)象類型和集合。它可以讓你創(chuàng)建模型時(shí)不必考慮持久層的局限性。
Hibernate提供了一個(gè)名為HQL的查詢語言,它與SQL非常相似,只是用對(duì)象屬性名代替了表的列。很多通過SQL實(shí)現(xiàn)的常用功能都能用HQL實(shí)現(xiàn)。
Hibernate的優(yōu)點(diǎn)之三:高效
Hibernate使用懶惰加載提高了性能,在Hibernate并不在加載父對(duì)象時(shí)就加載對(duì)象集合,而只在應(yīng)用需要訪問時(shí)才生成。這就避免了檢索不必要的對(duì)象而影響性能。
Hibernate允許檢索主對(duì)象時(shí)選擇性的禁止檢索關(guān)聯(lián)的對(duì)象,這也是一項(xiàng)改善性能的特性。
對(duì)象緩存在提高應(yīng)用性能方面也發(fā)揮了很大的作用。Hibernate支持各種開源和緩存產(chǎn)品,可為持久化類或持久化對(duì)象集合啟用緩存。
總結(jié)
在同一性,繼承和關(guān)聯(lián)三方面,對(duì)象模型和關(guān)系模型存在著阻抗不匹配,這是眾多ORM框架致力解決的問題,hibernate是這些方案中最成功的一個(gè),它的主要優(yōu)點(diǎn)是簡(jiǎn)單,靈活,功能完備和高效。
使用Hibernate不要求領(lǐng)域?qū)ο髮?shí)現(xiàn)特別的接口或使用應(yīng)用服務(wù)器,它支持集合,繼承,自定義數(shù)據(jù)類型,并攜帶一種強(qiáng)大的查詢語言HQL,能減少很多持久化方面的工作量,使程序員能把更多精力轉(zhuǎn)移到問題本身上來。
posted on 2008-04-30 16:35 和風(fēng)細(xì)雨 閱讀(1439) 評(píng)論(0) 編輯 收藏 所屬分類: Hibernate