討論Hibernate API 接口中的所有方法,只簡(jiǎn)要講一下每個(gè)主要 接口的功能,如果你想了解得更多的話,你可以在Hibernate 的源碼包中的net.sf.hibernate 子包中 去查看這些接口的源代碼。下面我們依次講一下所有的主要接口:
核心接口
以下5 個(gè)核心接口幾乎在任何實(shí)際開(kāi)發(fā)中都會(huì)用到。通過(guò)這些接口,你不僅可以存儲(chǔ)和獲得持 久對(duì)象,并且能夠進(jìn)行事務(wù)控制。
Configuration 接口
Configuration 接口的作用是對(duì)Hibernate 進(jìn)行配置,以及對(duì)它進(jìn)行啟動(dòng)。在Hibernate 的啟動(dòng)
過(guò)程中,Configuration 類(lèi)的實(shí)例首先定位映射文檔的位置,讀取這些配置,然后創(chuàng)建一個(gè)
SessionFactory 對(duì)象。
雖然Configuration 接口在整個(gè)Hibernate 項(xiàng)目中只扮演著一個(gè)很小的角色,但它是啟動(dòng)
hibernate 時(shí)你所遇到的每一個(gè)對(duì)象。
SessionFactory 接口
這里用到了一個(gè)設(shè)計(jì)模式――工廠模式,用戶(hù)程序從工廠類(lèi)SessionFactory 中取得Session 的 實(shí)例。
Session 接口
Session 接口對(duì)于Hibernate 開(kāi)發(fā)人員來(lái)說(shuō)是一個(gè)最重要的接口。然而在Hibernate 中,實(shí)例 化的Session 是一個(gè)輕量級(jí)的類(lèi),創(chuàng)建和銷(xiāo)毀它都不會(huì)占用很多資源。這在實(shí)際項(xiàng)目中確實(shí)很重要,
因?yàn)樵诳蛻?hù)程序中,可能會(huì)不斷地創(chuàng)建以及銷(xiāo)毀Session 對(duì)象,如果Session 的開(kāi)銷(xiāo)太大,會(huì)給系
統(tǒng)帶來(lái)不良影響。但值得注意的是Session 對(duì)象是非線程安全的,因此在你的設(shè)計(jì)中,最好是一個(gè) 線程只創(chuàng)建一個(gè)Session 對(duì)象。
在Hibernate 的設(shè)計(jì)者的頭腦中,他們將session 看作介于數(shù)據(jù)連接與事務(wù)管理一種中間接口。
我們可以將session 想象成一個(gè)持久對(duì)象的緩沖區(qū),Hibernate 能檢測(cè)到這些持久對(duì)象的改變,并及 時(shí)刷新數(shù)據(jù)庫(kù)。我們有時(shí)也稱(chēng)Session 是一個(gè)持久層管理器,因?yàn)樗@一些持久層相關(guān)的操作,
諸如存儲(chǔ)持久對(duì)象至數(shù)據(jù)庫(kù),以及從數(shù)據(jù)庫(kù)從獲得它們。請(qǐng)注意,Hibernate 的session 不同于JSP
應(yīng)用中的HttpSession 。當(dāng)我們使用session 這個(gè)術(shù)語(yǔ)時(shí),我們指的是Hibernate 中的session,而 我們以后會(huì)將HttpSesion 對(duì)象稱(chēng)為用戶(hù)session 。
Transaction 接口
Transaction 接口是一個(gè)可選的API,你可以選擇不使用這個(gè)接口,取而代之的是Hibernate 的
設(shè)計(jì)者自己寫(xiě)的底層事務(wù)處理代碼。Transaction 接口是對(duì)實(shí)際事務(wù)實(shí)現(xiàn)的一個(gè)抽象,這些實(shí)現(xiàn)包
括JDBC 的事務(wù)、JTA 中的UserTransaction 、甚至可以是CORBA 事務(wù)。之所以這樣設(shè)計(jì)是能讓開(kāi)
發(fā)者能夠使用一個(gè)統(tǒng)一事務(wù)的操作界面,使得自己的項(xiàng)目可以在不同的環(huán)境和容器之間方便地移值。
Query 和Criteria 接口
Query 接口讓你方便地對(duì)數(shù)據(jù)庫(kù)及持久對(duì)象進(jìn)行查詢(xún),它可以有兩種表達(dá)方式:HQL 語(yǔ)言或本
地?cái)?shù)據(jù)庫(kù)的SQL 語(yǔ)句。Query 經(jīng)常被用來(lái)綁定查詢(xún)參數(shù)、限制查詢(xún)記錄數(shù)量,并最終執(zhí)行查詢(xún)操作。
Criteria 接口與Query 接口非常類(lèi)似,它允許你創(chuàng)建并執(zhí)行面向?qū)ο蟮臉?biāo)準(zhǔn)化查詢(xún)。
值得注意的是Query 接口也是輕量級(jí)的,它不能在Session 之外使用。
Callback 接口
當(dāng)一些有用的事件發(fā)生時(shí)――例如持久對(duì)象的載入、存儲(chǔ)、刪除時(shí),Callback 接口會(huì)通知
Hibernate 去接收一個(gè)通知消息。一般而言,Callback 接口在用戶(hù)程序中并不是必須的,但你要在你
的項(xiàng)目中創(chuàng)建審計(jì)日志時(shí),你可能會(huì)用到它。
一個(gè)重要的術(shù)語(yǔ):Type
Hibernate 的設(shè)計(jì)者們發(fā)明了一個(gè)術(shù)語(yǔ):Type ,它在整個(gè)構(gòu)架中是一個(gè)非常基礎(chǔ)、有著強(qiáng)大功
能的元素。一個(gè)Type 對(duì)象能將一個(gè)Java 類(lèi)型映射到數(shù)據(jù)庫(kù)中一個(gè)表的字段中去(實(shí)際上,它可以 映射到表的多個(gè)字段中去)。持久類(lèi)的所有屬性都對(duì)應(yīng)一個(gè)type 。這種設(shè)計(jì)思想使用Hibernate 有著 高度的靈活性和擴(kuò)展性。
Hibernate 內(nèi)置很多type 類(lèi)型,幾乎包括所有的Java 基本類(lèi)型,例如Java.util.Currency 、
Java.util.calendar 、byte[] 和Java.io.Serializable 。
不僅如此, Hibernate 還支持用戶(hù)自定義的type ,通過(guò)實(shí)現(xiàn)接口UserType 和接口
CompositeUserType ,你可以加入自己的type 。你可以利用這種特色讓你的項(xiàng)目中使用自定義的諸 如Address 、Name 這樣的type,這樣你就可以獲得更大的便利,讓你的代碼更優(yōu)雅。自定義type 在Hibernate 中是一項(xiàng)核心特色,它的設(shè)計(jì)者鼓勵(lì)你多多使用它來(lái)創(chuàng)建一個(gè)靈活、優(yōu)雅的項(xiàng)目!
策略接口
Hibernate 與某些其它開(kāi)源軟件不同的還有一點(diǎn)――高度的可擴(kuò)展性,這通過(guò)它的內(nèi)置策略機(jī)制 來(lái)實(shí)現(xiàn)。當(dāng)你感覺(jué)到Hibernate 的某些功能不足,或者有某些缺陷時(shí),你可以開(kāi)發(fā)一個(gè)自己的策略
它的策略接口:
· 主鍵的生成(IdentifierGenerator 接口)
· 本地SQL 語(yǔ)言支持(Dialect 抽象類(lèi))
· 緩沖機(jī)制(Cache 和CacheProvider 接口)
· JDBC 連接管理(ConnectionProvider 接口)
· 事務(wù)管理(TransactionFactory, Transaction, 和TransactionManagerLookup 接口)
· ORM 策略(ClassPersister 接口)
· 屬性訪問(wèn)策略(PropertyAccessor 接口)
· 代理對(duì)象的創(chuàng)建(ProxyFactory 接口)
Hibernate 為以上所列的機(jī)制分別創(chuàng)建了一個(gè)缺省的實(shí)現(xiàn),因此如果你只是要增強(qiáng)它的某個(gè)策略
的功能的話,只需簡(jiǎn)單地繼承這個(gè)類(lèi)就可以了,沒(méi)有必要從頭開(kāi)始寫(xiě)代碼。
以上就是Hibernate 的一些核心接口,但當(dāng)我們真正開(kāi)始用它進(jìn)行開(kāi)發(fā)時(shí),你的腦海里可能總
會(huì)有一個(gè)疑問(wèn):我是通過(guò)什么方式,并從哪里取得Session 的呢?以下我們就解答這個(gè)問(wèn)題。
創(chuàng)建一個(gè)SessionFactory 對(duì)象
為了能創(chuàng)建一個(gè)SessionFactory 對(duì)象,你必須在Hibernate 初始化時(shí)創(chuàng)建一個(gè)Configuration
類(lèi)的實(shí)例,并將已寫(xiě)好的映射文件交由它處理。這樣, Configuration 對(duì)象就可以創(chuàng)建一個(gè)
SessionFactory 對(duì)象,當(dāng)SessionFactory 對(duì)象創(chuàng)建成功后,Configuration 對(duì)象就沒(méi)有用了,你可以簡(jiǎn)單地拋棄它。如下是示例代碼:
Configuration cfg = new Configuration();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session=sessionFactory.openSession();
Transaction ts=session.beginTransaction();
session.save(..);
ts.commit()