Hibernate核心接口(圖片)
Configuration
概述:Configuration 類負責管理Hibernate 的配置信息。它包括如下內容:
1 Hibernate運行的底層信息:數據庫的URL、用戶名、密碼、JDBC驅動類,數數據庫據庫Dialect,連接池等。
2 數據庫的特性信息
3 Hibernate映射文件(*.hbm.xml)。
Hibernate配置的兩種方法:
屬性文件(hibernate.properties)。
調用代碼:Configuration cfg = new Configuration();
Xml文件(hibernate.cfg.xml)。(推薦使用)
調用代碼:Configuration cfg = new Configuration().configure();
SessionFactory
作用:
1 創建session
2 作爲二級緩存,提高效率,存放經常查看但不經常修改的數據,例如,用戶名,密碼
3 生成全局事務,可以對session裏的所有事務做確認
創建:
通過Configuration創建
SessionFactory factory=cfg.buildSessionFactory();
使用特點:
原則上,一個數據庫使用一個session工廠
session工廠:線程安全,可被多個線程共享,創建耗時,通常在初始化的時候創建(web項目中推薦使用listener,java項目中使用靜態全局變量,使用靜態初始化塊進行初始化)
Session(持久化管理器)
作用:
1 ORM
2 作爲一級緩存(不需要配置)
3 管理事務
4 管理連接,採用dbcp連接池
創建:
由工廠創建
session=factory.openSession();
特點:線程不安全,使用完一定要關閉,多線程的時候採用綁定技術
Transaction(事物)
概念:數據庫對存儲或修改數據的確認操作
特性:一致性,原子性,持久性,隔離性
原子性:一個事務中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續數據庫可以自發性地完成預定的工作。
隔離性:數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。事務隔離分爲不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。
事務種類:
本地事務(jdbc事務):本地的一個數據庫的操作
跨資源事務(jta事務):轉賬的時候兩個賬戶的金額要同時變化
事務請求代理:用一個事務管理多個事務(二次提交,若第一次提交沒有回滾,就再次提交;若有回滾,其他所有事務都不提交)
如何使用事務:
hibernate是手動提交事務的
使用Hibernate進行操作時必須顯式的調用Transaction(默認:autoCommit=false)
事務範圍:
局部事務:session創建的事務,只對session裏的事務做確認
開啓事務session.beginTransaction();
提交事務session.getTransaction().commit();
事務回滾session.getTransaction().rollback();
工廠性事務:工廠創建的事務,都可以用工廠性事務做確認
Query
概念:通過HQL(對象的方式)對數據庫做查詢
Query支持HQL(查詢HQL )接口允許你在數據庫上執行查詢並控制查詢如何執行。查詢語句使用HQL或者本地數據庫的SQL方言編寫。
HQL是Hibernate的查詢語言,查詢對象,注意: HQL不能直接指定表,只能指定對象、指定實體。
持久化對象的生命週期
瞬時對象(瞬時態):使用new 操作符初始化的對象
User user=new User();
特點:1沒有納入session管理,2數據庫中沒有對應的記錄,3長時間未使用就GC掉
持久化對象:它由持久化管理器Session統一管理
session.save(user);
特點:
1 必須要有明確的主標識
2 User對象的屬性的值對應數據庫中字段的值一致(commit()提交事務後)
離線對象:Session關閉之後,持久化對象就變爲離線對象
特點:
1沒有納入session統一管理
2 在數據庫中有對應的記錄
Junit測試
使用目的:不需要編寫主方法,直接測試編寫每個方法,方便測試
傳統單元測試語法:
1 導入junit.Jar
2 繼承junit.framework.TestCase類
3 類名以大寫的Test結束
4 方法名以小寫test開頭
5 不能有任何參數和返回值
最好單元測試的代碼單獨建立一個目錄(Source Folder),且與src目錄同級
junit4只需要導入junit4.jar,在測試的方法上面加上@Test
通過Session緩存來理解持久化對象的生命週期
1瞬時狀態
(1)此時user對象的屬性值都還是初始值
session的臨時集合爲null
(2)執行到save()方法前
此時User對象的屬性值爲
session的零時集合依然爲null,同上
2 持久態
執行完save()方法
此時user裏的屬性值如下圖,hibernate自動生成了主鍵
session的兩個臨時集合instance和state存放情況
instance存放最新的實體對象數據,state存放最早的實體對象的數據
session緩存persistenceContext裏的entityEntries的map裏
map裏的entries的teble裏
Key裏面存放的值爲:(存放User對象當前最新的狀態)
Value裏面的值爲:
existsInDatabase的值爲false,表示數據庫裏還未有這條記錄
loadedState存放的是最早的狀態,和數據庫裏的一樣
修改User對象裏的屬性值
hibernate此時會根據state集合裏面的值來生成sql語句
此時session裏的臨時集合instance裏的值改變,state集合裏的值不改變
session緩存裏面的map集合的key裏面的值改變,value裏面的loadedState存放的值不變
3 持久態 提交完事務
User的屬性值爲;
Session緩存裏面的map集合的key和value裏的loadedState和existsInDatabase值情況(loadedState裏的值會更新爲和key的值一樣,existsInDatabase變爲true,表示數據庫中已經有和User實體對象屬性對應得記錄):
session兩個零時集合得值會變爲null,在變爲null之前,hibernate會先根據state集合裏面得值生成一條sql語句:
Hibernate: insert into User (name, password, createTime, expireTime, id) values (?, ?, ?, ?, ?)
然後發現instance裏面的值與state集合裏面的值不一樣,又會根據instance裏面的值創建一條新的更新sql語句:
Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?
4離線態(session關閉之後)修改User對象屬性值
User對象的值爲;
session的兩個臨時集合和緩存裏面的值都爲null
5從離線態到持久態
Session緩存裏面map的key值爲:
Value裏面的existsInDatabase的值和loadedState裏的值爲:
existsInDatabase爲true表示數據庫裏已經有這個User對象屬性對應的記錄,但是此時值不一致
loadedState爲null,是因爲不清楚數據庫裏是什麼值
此時session兩個臨時集合裏的值依然爲Null
6 持久態(事務提交後)
session緩存的map集合的value的loadedState的值(和key裏的值一樣):
Hibernate會根據map裏面的key的值來創建一條更新的sql語句
Hibernate: update User set name=?, password=?, createTime=?, expireTime=? where id=?
此時session兩個臨時集合裏的值依然爲null
7離線態(session關閉)
數據庫中的記錄的各個字段的值和User對象對應的屬性值一致