1. 明確Hibernate是一個實現了ORM思想的框架,它封裝了JDBC,是程序員可以用對象編程思想來操作數據庫。
2. 明確ORM(對象關系映射)是一種思想,JPA(Java Persistence API)是JDK實現ORM思想的規范(一套接口),Hibernate又是這套接口的具體實現。
3. 明確Hibernate程序四要素:實體類(POJO類)、映射文件(*.hbm.xml)、主配置文件(hibernate.cfg.xml)和調用Hibernate的程序。
4. 明確映射文件中重點關注Hbiernate常用的六種內置主鍵生成策略:increment、identity、sequence、native、uuid、assigned生成策略。
5. 明確調用Hibernate程度時,session的方法必須在事務之內執行,因為session是操作緩存中的數據,只有提交了事務之后,緩存中的數據才能寫到數據庫中。
6. 明確Hibernate對單表的增刪改查操作,注意查詢的時候get與load的區別,注意底層增刪改的執行順序不一定同代碼的順序相同,如果想用一定的順序執行,需要在適當的位置添加刷新點,以使刷新點之前的代碼先執行。
7. 明確Hbiernate的四個重要接口:
1. Configuration接口:用於加載主配置文件和映射文件,以實現對Hibernate的啟動。
2. SessionFactory接口:用於開啟Session對象,SessionFactory是一個重量級對象(開銷大)、單例對象,但同時是線程安全的(因為大多數成員變量是final的),由Configuration對象開啟,應用結束時自動關閉。
3. Session接口:用於向應用程序提供操作數據庫的方法,Session是一個輕量級對象、多例對象(一個用戶一個Session對象)、線程不安全的(因為一個用戶的多個事務會同時對Session對象進行訪問,引起並發問題);
Session的使用原則是一個線程(事務)一個Session,使用完畢,立即關閉;
因此,通常使用getCurrentSession()方法,它將openSession()方法包裝到了ThreadLocal方法中,從而使得同一線程只有一個Session對象,且事務提交或回滾后,Session會自動關閉。
4. Transcation接口:通過該接口,可以將事務從持久層,提升到Dao層。由Session對象創建。
8. 明確Hibernate中的對象的四種狀態:瞬時態、持久態、游離態、和無名態。
9. 明確Hibernate支持原始SQL語句查詢,支持QBC查詢及Hibernate特有的HQL查詢。
HQL,Hibernate Query Language,Hibernate查詢語言,它與SQL非常相似。但,HQL是面向對象的查詢語言,而SQL是面向二維表的。HQL查詢語句中使用的是類名與屬性名,而SQL語句使用的是表名與字段名。
QBC,Query By Criteria,標准查詢,一種比HQL更為面向對象的查詢方法。
注意:iterator()和list()方法的區別,以及N+1問題的解決。
10. 重點明確關聯關系映射,關聯關系在內存中反映為實體關系,映射到DB中為主外鍵關系。實體間的關聯,即對外鍵的維護。關聯關系的發生,即對外鍵數據的改變;
關聯方向分為單向關聯和雙向關聯;
關聯關系維護,在1:n關聯中分為一方維護和多方維護,兩者的底層執行是不同的,哪方維護關聯關系,代碼中就save誰,並且執行時先插入關聯方數據,另外只有一方可以放棄維護權,轉交給多方維護;
關聯關系維護,在n:m關聯中是通過中間表的形式實現的。
11. 明確Hbiernate檢索優化,所謂檢索優化,指的是並不是代碼中一出現查詢語句,馬上就在后台調用執行select語句。而是在代碼中真正需要時才執行select。即將select的執行進行了最大可能的“延遲”;
根據檢索對象的不同,可以將檢索優化分為兩類: (1)當前對象檢索優化 (2)關聯對象檢索優化
對於不使用優化進行對象檢索的過程,稱為直接加載;否則稱為延遲加載,或懶加載。
對於當前對象進行檢索加載,Session中提供了兩個方法:get()與load();
默認情況下,get()為直接加載,而load()為延遲加載,load()方法默認情況下采用延遲加載策略,但也是可以改變的,可以改為直接加載;
對於關聯對象的檢索,也可進行延遲加載的優化。采用何種優化策略,要依據映射文件的配置。映射文件中對於關聯對象檢索的優化配置屬性有兩個:lazy、fetch;
關聯對象檢索優化分為兩種: (1)多端配置優化 (2)單端配置優化
12. 明確Hibernate緩存機制,分為事務范圍緩存、應用范圍緩存、集群范圍緩存(不介紹)
1. 事務范圍緩存(單Session,即一級緩存):伴隨着事務的開啟而開啟,伴隨着事務的關閉而關閉,一級緩存由Hibernate管理,不受程序員控制;
注意刷新時間點的概念,Session的刷新是指Session緩存中的數據的更新,默認的刷新時間點有三個:執行Query查詢,執行session.flush(),執行事務的提交,可以修改刷新時間點,是部分時間點失效;
插入操作不到刷新時間點就執行,刪除操作一到刷新時間點就執行,更新操作到刷新時間點要比較快照才能決定是否執行;
注意同步時間點的概念,Session的同步是指,將Session緩存中的數據同步更新到數據庫中,執行同步的時間點只有一個:事務的提交;
注意快照的概念,簡單來說就是當代碼通過Session的查詢方法調用,將數據加載到內存后,Hbiernate會將此數據存於Session緩存中,同時在快照中備份該數據,快照中的數據在刷新點前是不可以被修改的,當刷新點到來時,比較快照中的數據和Session緩存中的數據,無論是否執行update語句,只有數據不相同的時候,才執行相應的更新操作,同時改變Session緩存中的數據和快照中的數據。
2. 應用范圍緩存(單SessionFactory,即二級緩存):應用范圍的緩存可以被應用程序內的所有事務共享訪問,緩存的生命周期依賴於應用的生命周期;
准確來說,SessionFactory緩存的外置緩存才稱作二級緩存,Hbiernate本身只提供了二級緩存的規范,但沒有實現,所以需要提供第三方緩存產品的支持;
二級緩存分為四類:類緩存、集合緩存、更新時間戳緩存、查詢緩存(Query查詢結果的緩存,區分於get和load方法),一級緩存只有類緩存;
類緩存,緩存的是類的詳情;集合緩存,在沒有對集合中元素對應的類進行類緩存的時候,緩存的是所有元素的id;
Query查詢默認不會從一、二級緩存中讀取數據,但可以改變,同時Query查詢要從緩存中讀取數據,必須保證Query所執行的HQL語句完全相同;
二級緩存的並發訪問策略(具體現在不研究):事務型、讀寫型、非嚴格讀寫型、只讀型;
13. 明確Hibernate對事務並發控制的管理,使用樂觀鎖和悲觀鎖解決提交更新丟失問題,同時Hbiernate可以設置事務的隔離級別,同數據庫的事務隔離級別。
14. 明確Hibernate注解開發,主要是為了替代映射文件。