WIKI使用導(dǎo)航
站長(zhǎng)百科導(dǎo)航
站長(zhǎng)專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機(jī)
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計(jì)算
- 微博營(yíng)銷
- 虛擬主機(jī)管理系統(tǒng)
- 開放平臺(tái)
- WIKI程序與應(yīng)用
- 美國(guó)十大主機(jī)
Hibernate
Hibernate是一種Java語言下的對(duì)象關(guān)系映射解決方案。 它是使用GNU寬通用公共許可證發(fā)行的自由、開源的軟件。它為框架。
Hibernate對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來操縱數(shù)據(jù)庫。Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。
簡(jiǎn)介[ ]
大多數(shù)應(yīng)用程序都需要處理數(shù)據(jù)。Java應(yīng)用程序運(yùn)行時(shí),往往把數(shù)據(jù)封裝為相互連接的對(duì)象網(wǎng)絡(luò),但是當(dāng)程序結(jié)束時(shí),這些對(duì)象就會(huì)消失在一團(tuán)邏輯中,所以需要有一些保存它們的方法。有時(shí)候,甚至在編寫應(yīng)用程序之前,數(shù)據(jù)就已經(jīng)存在了,所以需要有讀入它們和將其表示為對(duì)象的方法。手動(dòng)編寫代碼來執(zhí)行這些任務(wù)不僅單調(diào)乏味、易于出錯(cuò),而且會(huì)占用整個(gè)應(yīng)用程序的很大一部分開發(fā)工作量。
優(yōu)秀的面向?qū)ο箝_發(fā)人員厭倦了這種重復(fù)性的勞動(dòng),他們開始采用通常的“積極”偷懶做法,即創(chuàng)建工具,使整個(gè)過程自動(dòng)化。對(duì)于關(guān)系數(shù)據(jù)庫來說,這種努力的最大成果就是對(duì)象/關(guān)系映射(ORM)工具。
這類工具有很多,從昂貴的商業(yè)產(chǎn)品到內(nèi)置于J2EE中的EJB標(biāo)準(zhǔn)。然而,在很多情況下,這些工具具有自身的復(fù)雜性,使得開發(fā)人員必須學(xué)習(xí)使用它們的詳細(xì)規(guī)則,并修改組成應(yīng)用程序的類以滿足映射系統(tǒng)的需要。由于這些工具為應(yīng)付更加嚴(yán)格和復(fù)雜的企業(yè)需求而不斷發(fā)展,于是在比較簡(jiǎn)單和常見的場(chǎng)景中,使用它們所面臨的復(fù)雜性反而蓋過了所能獲得的好處。這引起了一場(chǎng)革命,促進(jìn)了輕量級(jí)解決方案的出現(xiàn),而Hibernate就是這樣的一個(gè)例子。
核心接口[ ]
Hibernate的核心接口一共有5個(gè),分別為:Session、SessionFactory、Transaction、Query和Configuration。這5個(gè)核心接口在任何開發(fā)中都會(huì)用到。通過這些接口,不僅可以對(duì)持久化對(duì)象進(jìn)行存取,還能夠進(jìn)行事務(wù)控制。下面對(duì)這五個(gè)核心接口分別加以介紹。
Session接口[ ]
Session接口負(fù)責(zé)執(zhí)行被持久化對(duì)象的CRUD操作(CRUD的任務(wù)是完成與數(shù)據(jù)庫的交流,包含了很多常見的SQL語句。)。但需要注意的是Session對(duì)象是非線程安全的。同時(shí),Hibernate的session不同于JSP應(yīng)用中的HttpSession。這里當(dāng)使用session這個(gè)術(shù)語時(shí),其實(shí)指的是Hibernate中的session,而以后會(huì)將HttpSession對(duì)象稱為用戶session。
SessionFactory接口[ ]
SessionFactory接口負(fù)責(zé)初始化Hibernate。它充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并負(fù)責(zé)創(chuàng)建Session對(duì)象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級(jí)的,因?yàn)橐话闱闆r下,一個(gè)項(xiàng)目通常只需要一個(gè)SessionFactory就夠,當(dāng)需要操作多個(gè)數(shù)據(jù)庫時(shí),可以為每個(gè)數(shù)據(jù)庫指定一個(gè)SessionFactory。
Configuration接口[ ]
Configuration接口負(fù)責(zé)配置并啟動(dòng)Hibernate,創(chuàng)建SessionFactory對(duì)象。在Hibernate的啟動(dòng)的過程中,Configuration類的實(shí)例首先定位映射文檔位置、讀取配置,然后創(chuàng)建SessionFactory對(duì)象。
Transaction接口[ ]
Transaction接口負(fù)責(zé)事務(wù)相關(guān)的操作。它是可選的,開發(fā)人員也可以設(shè)計(jì)編寫自己的底層事務(wù)處理代碼。
Query和Criteria接口[ ]
Query和Criteria接口負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫查詢。它可以使用HQL語言或SQL語句兩種表達(dá)方式。
Hibernate主鍵介紹[ ]
Assigned[ ]
Assigned方式由用戶生成主鍵值,并且要在save()之前指定否則會(huì)拋出異常
特點(diǎn):主鍵的生成值完全由用戶決定,與底層數(shù)據(jù)庫無關(guān)。用戶需要維護(hù)主鍵值,在調(diào)用session.save()之前要指定主鍵值。
Hilo[ ]
Hilo使用高低位算法生成主鍵,高低位算法使用一個(gè)高位值和一個(gè)低位值,然后把算法得到的兩個(gè)值拼接起來作為數(shù)據(jù)庫中的唯一主鍵。Hilo方式需要額外的數(shù)據(jù)庫表和字段提供高位值來源。默認(rèn)請(qǐng)況下使用的表是hibernate_unique_key,默認(rèn)字段叫作next_hi。next_hi必須有一條記錄否則會(huì)出現(xiàn)錯(cuò)誤。
特點(diǎn):需要額外的數(shù)據(jù)庫表的支持,能保證同一個(gè)數(shù)據(jù)庫中主鍵的唯一性,但不能保證多個(gè)數(shù)據(jù)庫之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate 維護(hù),所以Hilo方式與底層數(shù)據(jù)庫無關(guān),但不應(yīng)該手動(dòng)修改hi/lo算法使用的表的值,否則會(huì)引起主鍵重復(fù)的異常。
Increment[ ]
Increment方式對(duì)主鍵值采取自動(dòng)增長(zhǎng)的方式生成新的主鍵值,但要求底層數(shù)據(jù)庫的支持Sequence。如Oracle,DB2等。需要在映射文件xxx.hbm.xml中加入Increment標(biāo)志符的設(shè)置。
特點(diǎn):由Hibernate本身維護(hù),適用于所有的數(shù)據(jù)庫,不適合多進(jìn)程并發(fā)更新數(shù)據(jù)庫,適合單一進(jìn)程訪問數(shù)據(jù)庫。不能用于群集環(huán)境。
Identity[ ]
Identity當(dāng)時(shí)根據(jù)底層數(shù)據(jù)庫,來支持自動(dòng)增長(zhǎng),不同的數(shù)據(jù)庫用不同的主鍵增長(zhǎng)方式。
特點(diǎn):與底層數(shù)據(jù)庫有關(guān),要求數(shù)據(jù)庫支持Identity,如MySQL中是auto_increment, SQL Server 中是Identity,支持的數(shù)據(jù)庫有MySql、SQL Server、DB2、Sybase和HypersonicSQL。 Identity無需Hibernate和用戶的干涉,使用較為方便,但不便于在不同的數(shù)據(jù)庫之間移植程序。
Sequence[ ]
Sequence需要底層數(shù)據(jù)庫支持Sequence方式,例如Oracle數(shù)據(jù)庫等
特點(diǎn):需要底層數(shù)據(jù)庫的支持序列,支持序列的數(shù)據(jù)庫有DB2、PostgreSql、Oracle、SAPDb等在不同數(shù)據(jù)庫之間移植程序,特別從支持序列的數(shù)據(jù)庫移植到不支持序列的數(shù)據(jù)庫需要修改配置文件
Native[ ]
Native主鍵生成方式會(huì)根據(jù)不同的底層數(shù)據(jù)庫自動(dòng)選擇Identity、Sequence、Hilo主鍵生成方式
特點(diǎn):根據(jù)不同的底層數(shù)據(jù)庫采用不同的主鍵生成方式。由于Hibernate會(huì)根據(jù)底層數(shù)據(jù)庫采用不同的映射方式,因此便于程序移植,項(xiàng)目中如果用到多個(gè)數(shù)據(jù)庫時(shí),可以使用這種方式。
UUID[ ]
UUID使用128位UUID算法生成主鍵,能夠保證網(wǎng)絡(luò)環(huán)境下的主鍵唯一性,也就能夠保證在不同數(shù)據(jù)庫及不同服務(wù)器下主鍵的唯一性。
特點(diǎn);能夠保證數(shù)據(jù)庫中的主鍵唯一性,生成的主鍵占用比較多的存貯空間
Foreign GUID[ ]
Foreign用于一對(duì)一關(guān)系中。GUID主鍵生成方式使用了一種特殊算法,保證生成主鍵的唯一性,支持SQL Server和MySQL
Hibernate源碼對(duì)照[ ]
- net.sf.hibernate.* :該包的類基本上都是接口類和異常類
- net.sf.hibernate.cache.* :JCS的實(shí)現(xiàn)類
- net.sf.hibernate.cfg.* :配置文件讀取類
- net.sf.hibernate.collection.* :Hibernate集合接口實(shí)現(xiàn)類,例如List,Set,Bag等等,Hibernate之所以要自行編寫集合接口實(shí)現(xiàn)類是為了支持lazy loading
- net.sf.hibernate.connection.* :幾個(gè)數(shù)據(jù)庫連接池的Provider
- net.sf.hibernate.dialect.* :支持多種數(shù)據(jù)庫特性,每個(gè)Dialect實(shí)現(xiàn)類代表一種數(shù)據(jù)庫,描述了該數(shù)據(jù)庫支持的數(shù)據(jù)類型和其它特點(diǎn),例如是否有AutoIncrement,是否有Sequence,是否有分頁sql等等
- net.sf.hibernate. eg.* :Hibernate文檔中用到的例子
- net.sf.hibernate.engine.* :這個(gè)包的類作用比較散
- net.sf.hibernate.expression.* :HQL支持的表達(dá)式
- net.sf.hibernate.hq.* :HQL實(shí)現(xiàn)
- net.sf.hibernate. id.* :ID生成器
- net.sf.hibernate.impl.* :最核心的包,一些重要接口的實(shí)現(xiàn)類,如果Session,SessionFactory,Query等
- net.sf.hibernate.jca.* :JCA支持,把Session包裝為支持JCA的接口實(shí)現(xiàn)類
- net.sf.hibernate.jmx.* :JMX是用來編寫App Server的管理程序的,使得App Server可以通過JMX接口管理Hibernate
- net.sf.hibernate.loader.* :也是很核心的包,主要是生成sql語句的
- net.sf.hibernate.lob.* :Blob和Clob支持
- net.sf.hibernate.mapping.* :hbm文件的屬性實(shí)現(xiàn)
- net.sf.hibernate.metadata.* :PO的Meta實(shí)現(xiàn)
- net.sf.hibernate.odmg.* :ODMG是一個(gè)ORM標(biāo)準(zhǔn),這個(gè)包是ODMG標(biāo)準(zhǔn)的實(shí)現(xiàn)類
- net.sf.hibernate.persister.* :核心包,實(shí)現(xiàn)持久對(duì)象和表之間的映射
- net.sf.hibernate.proxy.* :Proxy和Lazy Loading支持
- net.sf.hibernate. ps.* :該包是PreparedStatment Cache
- net.sf.hibernate.sql.* :生成JDBC sql語句的包
- net.sf.hibernate.test.* :測(cè)試類,你可以用junit來測(cè)試Hibernate
- net.sf.hibernate.tool.hbm2ddl.* :用hbm配置文件生成DDL
- net.sf.hibernate.transaction.* :Hibernate Transaction實(shí)現(xiàn)類
- net.sf.hibernate.type.* :Hibernate中定義的持久對(duì)象的屬性的數(shù)據(jù)類型
- net.sf.hibernate.util.* :一些工具類,作用比較散
- net.sf.hibernate.xml.* :XML數(shù)據(jù)綁定