Hibernate建立數據庫連接的時序圖如下:

我們簡單解釋以下幾點:
* 1,2,3,4,5,6,7,8的目的在于獲取一個用于可以制造session(會話)的工廠,即sessionFactory。可以認為這是固有的寫法。
* 每個數據庫都對應一個sessionFactory。所以在一般的程序中,如果只涉及到對一個數據表進行操作,那么僅僅需要一個sessionFactory.
* 通過sessionFactory可以獲取到用于連接數據庫信息的session(會話)。一個sessionFactory可以制造N個session。每個session都可以起到與數據庫進行會話的作用。
* 往往我們通過sessionFactory只獲取一個(session)對話。
* 數據的提交采用的是事務。什么是事務呢?簡單的理解為,事務是一系列的數據表操作。即一個事務,對應著先后執行N條SQL語句。采用事務的好處就是,如果多條語句中,有一條沒有成功執行,事務會自動的進行回滾操作。
* 比如在銀行轉賬時,張三轉錢給李四,那么我們需要增加李四的錢的同時減少張三的錢。
* 我們把這樣兩條SQL語句放到事務中,由事務進行提交執行。
* 假設增加李四的錢的操作被正常的執行了,而執行減少張三的錢的時候,恰恰發生了錯誤。
* 這時,事務監測到了這個錯誤,從而回滾增加李四錢的操作。
* 最終達到了:發生錯誤時,李四的錢不增多,張三的錢不減少。
* Hibernate進行了惰性連接處理。在開啟事務時,才會嘗試對數據庫進行連接。
> 想測試配置信息是否正確,則必須執行至開啟事務。
# 測試
```
package hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
import java.util.List;
import java.util.Properties;
public class TestCfgXml {
@Test
public void TestConfig() {
try {
// 實例化
Configuration configuration = new Configuration();
// 加載數據庫配置文件
configuration.configure();
// 讀取數據庫配置信息
Properties configs = configuration.getProperties();
// 實例化服務注冊對象構造器(用于構造服務對象)
ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder();
// 傳入數據庫配置信息
serviceRegistryBuilder.applySettings(configs);
// 構造服務注冊對象
ServiceRegistry serviceRegistry = serviceRegistryBuilder
.buildServiceRegistry();
// 創建會話工廠(session factory))
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
// 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話)
Session session = sessionFactory.getCurrentSession();
// 開啟事務(使用緩沖池進行數據庫的連接)
session.beginTransaction();
// 關閉session
session.close();
} catch (Exception e) {
System.out.println("發生錯誤:");
System.out.println(e);
}
}
}
```
此時,我們在hibrenate.cfg.xml中將數據庫名javaee更改為javaee1,再進行測試。將得到如下錯誤:
```
ERROR: Unknown database 'javaee1'
發生錯誤:
org.hibernate.exception.SQLGrammarException: Could not open connection
```
提示我們數據庫未找到。當然了,我們還可以更改其它的配置選項,來查看具體的配置信息錯誤時的出錯信息.
## 參考資料:
sesssion與sessionFactory:
[http://blog.csdn.net/jiangxindu1/article/details/48037731](http://blog.csdn.net/jiangxindu1/article/details/48037731)
[https://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/transactions.html](https://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/transactions.html)
事務:
[http://www.jianshu.com/p/eb150b4f7ce0](http://www.jianshu.com/p/eb150b4f7ce0)
- README
- 第一章:準備
- 第二章:Hello World!
- 第一節:查看工程文件
- 第二節:JDK、JRE與環境變量
- 第三節:index.jsp
- 第三章:Hello Struts
- 第一節:Web.xml
- 第二節:單入口
- 第三節:Hello Struts
- 第四節:觸發C層
- 第四章:建立數據表
- 第一節:建立實體類
- 第二節:測試一
- 第三節:測試二
- 第四節:引入Hibernate
- 第五節:配置Hibernate
- 第六節:建立連接
- 第七節:實體類映射數據表
- 第八節:完善數據表
- 第五章:教師管理
- 第一節:增加數據--add
- 第二節:增加數據--save
- 1 獲取傳入數據數據
- 2 數據寫入測試
- 3 對接C層
- 第三節:數據列表
- 1 獲取數據
- 2 重構代碼
- 3 C層對接--初始化
- 4 C層添加數據
- 5 V層顯示數據
- 6 獲取數據庫中數據
- 7 顯示性別
- 8 分頁
- 9 條件查詢
- 第四節:修改數據
- 1 edit
- 2 update
- 第五節:刪除數據
- 第六節:總結
- 第六章:重構C層
- 第一節:繼承ActionSupport類
- 第二節:數據驗證
- 第七章:前臺分離(前臺)
- 第一節:環境搭建
- 第二節:運行環境
- 第三節:共享開發環境
- 第四節:生產環境
- 第八章:前臺開發(前臺)
- 第一節:本地化
- 第二節:教師列表
- 1 引入M層
- 2 模擬后臺返回數據
- 3 C與M對接
- 4 C與V對接
- 第九章:前后臺對接(前后臺)
- 第一節:后臺輸出json(后臺)
- 第二節:對接前臺(全棧)
- 第二節:對接API(前臺)
- 第二節:跨域請求(后臺)
- 第三節:重構代碼(前臺)
- 第十章:重構后臺M層
- 第一節:數據訪問DAO層
- 第二節:項目整體重構
- 第十一章:用戶登陸(前后臺)
- 第一節:制定規范
- 第二節:定制測試用例
- 第三節:后臺輸入測試代碼(后臺)
- 第四節:postman(后臺)
- 第五節:新建用戶登陸模塊(前臺)
- 第六節:代碼重構(前臺)
- 第十二章:班級管理(前后臺)
- 第一節:班級列表
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第二節:Add
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第三節:Save
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第四節:Edit
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第五節:Update
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第六節:Delete
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第七節:小結
- 第十三章:班級管理(API)
- 第一節:ER圖
- 第二節:create
- 1 實體層
- 2 dao層
- 3 service(server)層
- 4 action層
- 第三節:ManyToOne
- 第四節:Read
- 1 service(server)層
- 2 action層
- 第五節:update
- 1 service(server)層
- 2 action層
- 第六節:update
- 第十四章:重構服務層