Hibernate 使用初體驗之操作流程
1. 前言
Hibernate 神奇之處在于只需要簡簡單單的幾行代碼,就能完成原生 JDBC 中復雜的操作。
本節課程的主要知識點:
- 初步認識、了解 Hibernate 核心組件各自的基礎功能;
- 編寫 Hibernate 程序的流程。
2. Hibernate 核心組件
獨木難成林,一個好漢三個幫!
開發者的應用程序依賴 Hibernate 完成數據庫中數據操作任務時,Hibernate 又會依靠它體系內的多個組件一起協同完成任務。
如下圖展示了 Hibernate 的核心組件庫中部分組件之間的依賴關系。
開發者需要使用 Hibernate 暴露給開發者的組件 API 進行對接開發,先看看分別都有誰:
- Configuration;
- ServiceRegistry;
- SessionFactory;
- Session;
- Transaction。
這幾大組件各有來頭,想要完全駕馭,則需了解其秉性和功能,后面章節會一一展開討論。此處只需要了解這幾大組件在構建一個完整的操作流程時各自的核心作用及出現順序。
如下圖示:

簡述一下流程:
-
通過 Configuration 對象讀取主配置文件,故需為此對象指定主配置文件的位置,如不指定,由從默認位置即編譯后的主目錄(classes 或 bin)中讀?。?/p>
-
配置對象在擁有了數據庫連接配置信息后便可以創建 SessionFactory 對象。此組件可認為是應用程序中對某一個具體關系型數據庫系統的抽象引用。透明地認為它就是數據庫的鏡像;
-
由 SessionFactory 對象創建出可以直接操作數據庫的會話對象(Session)。Session 對象相當于原生 Jdbc 中的 Connection 對象,但比其具有更豐富的實際操作功能,Session 對象也叫做持久化容器。應用程序主要使用此對象進行一系列具體的數據操作,有它便可“掃貨”數據庫中的數據;
-
Transaction 在具體操作中起事務監控作用,負責及時提交,及時剎車回滾。
認識了 Hibernate 中的這群肝膽相照的好兄弟,了解了他們的各自職責,它們通過分工合作的方式把應用程序的意圖向 Hibernate 內部組件逐層傳達。現在是著手編寫一個完整代碼的時候了,有了結果的過程更能感受到 Hibernate 的魅力。
Hibernate 4.x 之后的版本中多了一個 ServiceRegistry組件,此組件到后面章節論述。
3. 編寫 Hibernate 程序
本文程序開發環境說明:
- 操作系統: windows 7 以上;
- 開發工具: Eclipse 。
此方案可作為學習者的可選擇方案之一,有興趣可了解其它系統或開發工具!
3.1 程序開發流程
新建一個 Java Project 項目,想必此處不需要更多累贅說明。
程序中需要使用 Hibernate 組件所提供的功能,因此程序中需要加入 Hibernate 的各組件所在的 Jar 包。
依賴包的加入方式有 2 種:
- 使用 Maven 的依賴管理功能自動加入,需要 Maven 相關知識,此文不介紹,需要了解可自行查閱相關資料;
- 手工方式加入,辛苦著并快樂著。
本課程采用第 2 方式,手工加入:
- 下載: Hibernate-release-4.2.0.Final.zip;
小插曲:為什么選擇 4.x 版本?
企業只會選擇市場上運行時間較久、穩定性經過時間檢驗的版本,4.x 版本已經出現一些時間,稱得上較穩定版本,將來進入企業可直接上手。
高版本封裝度高,從應用角度講,只會更簡單,從學習角度講,不便于了解更多過往操作細節。
官網:http://hibernate.org/
- 解壓: 找到解壓后 Hibernate 目錄下的 lib 子目錄,從其中選擇程序需要的基礎包。切記別忘記加入 MySql Jdbc 驅動包(本文使用 MySql 相關的 Jdbc 驅動包)
友情提示時間:
- 把 Student.java 文件和 Student.hbm.xml 最好放在一起,不放在一起問題也不大。但兩個文件構成了邏輯上持久化對象描述,既然是手足兄弟放在一起可加深情感上的聯系。
- 把 Hibernate.cfg.xml 放在src下,運行時會編譯到 classes 或 bin 目錄下,此處為加載主配置文件的默認位置。
思考時間:Hibernate.cfg.xml 不放在 src 下可不可以?
用 Java 語言復述一下上面的中文描述流程:
// 配置對象
Configuration configuration = new Configuration().configure();
// 服務注冊
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
// 會話工廠
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
// 會話對象
Session session = sessionFactory.openSession();
// 事務對象
Transaction transaction = null;
try {
// 啟用事務
transaction = session.beginTransaction();
//各種增、刪、改、查…… 操作
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
session.close();
}
一定要細心觀察啦!發現沒有!使用Hibernate對數據庫進行一系列操作也是一個模板化流程。
友情提示時間:
- 不使用 ServiceRegistry 對象,configuration.buildSessionFactory() 形式也可以創建會話工廠!(官方文檔就這么創建的);
- 如果使用 ServiceRegistry,則需要注意上面的語法使用要點!否則有可能會出現配置信息讀不到,會話工廠創建不成功的情況;
- 最后不要忘記關閉會話對象(Session)。
3.2 插入一條數據試試
在進行數據庫中對應表中數據的 CRUD 之前,需要保證數據庫中有對應的表結構。
Hibernate 為了讓我們更專心于測試、了解操作流程及規范,避免開發者因切換不同的工作環境而影響思維慣性,提供了一個很好玩的功能!
利用 PO 對象信息自動在數據庫系統中生成和 PO 對象類結構相似的表結構,是不是酷得不要不要的。大家一起來膜拜下!
要使用此功能,則只需要在 Hibernate.cfg.xml 主配置文件中添加如下一行
<property name="hbm2ddl.auto">create</property>
好!開始向 MySql 的 mystus 數據庫中的 student 表中插入一條數據吧。
切記,此時數據庫中還沒有 student 表,更談不上有數據。但是!奇跡馬上就要發生。
// 配置對象
Configuration configuration = new Configuration().configure();
// 服務注冊
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
// 會話工廠
SessionFactory sessionFactory =configuration.buildSessionFactory(serviceRegistry);
// 會話對象
Session session = sessionFactory.openSession();
// 事務對象
Transaction transaction = null;
try {
// 打開事務
transaction = session.beginTransaction();
//添加一條學生信息
Student student=new Student(1, "hibernate01","男");
session.save(student);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
session.close();
}
運行上述代碼,再利用可視化工具進入 MySql 系統中查看一下,則會看到上面代碼所產生的結果!
表和數據都已經存在了,是不是一件令人開心的事情呢!
高興之余可別忘記下面的建議!
- 如果希望保留每一次添加的數據,則除了第一次 hbm2ddl.auto 屬性的值為 create 外,后繼需要改成 update 或 validate;
create 只要加載配置文件便會刪除表,再創建表,周而復始!
update 或 validate 只有當 PO 對象類結構修改后才會觸發表結構的變化
- 建議 hbm2ddl.auto 的功能只用于學習 Hibernate 的過程中,數據庫設計由專業數據庫需求設計師考慮為好。
4. 小結
本章節內容就要結束了,但學習之路才剛剛開始。
本章節認識了 Hibernate 的核心組件,并了解了 Hibernate 的具體操作流程。并把一條數據從應用程序中插入到了 MySql 中的表中。感受 Hibernate 神奇之時,更需要思考 Hibernate 又是如何做到的。
另外,本節內容雖然選擇的是 MySql 數據庫,但并不意味著你不可以選擇其它數據庫。
路漫漫其修遠兮,吾將上下而求索,下節課程一起繼續相逢在Hibernate 的江湖!