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