Hibernate框架的相關知識點(1)

hibernate框架基礎瞭解
(一)Hibernate的三種狀態如何轉化?
當對象由瞬時狀態(Transient)---save()時,就變成了持久化狀態。
當在session中存儲對象的時候,實際上是在session的Map中存了一份,也就是在它的緩存中存了一份,然後,又到數據庫中存了一份,在緩存中的這一份叫做持久化對象(Persient)
Session---close(),它的緩存也都關閉了,整個session也就失效了,此時,這個對象變成了遊離狀態(Detached),但是在數據庫中還是存在的
當遊離狀態(Detached)update()時,又變成了持久化狀態。
當持久狀態(Persistent)delete()時,又變成了瞬時狀態,此時數據庫中沒有與之對應的記錄
(二)Hibernate中update()和saveOrUpdate()的區別,session的load()和get()的區別
update是更新一個對象,針對的是已經存在的對象
saveOrUpdate是根據實體判斷,如果沒有的話就保存實體,如果有實體的話才修改
重點:最主要的區別就在於是否進行延遲加載load不會立即訪問數據庫,當試圖加載的數據不存在時,load方法返回未初始化的代理對象;而get()會直接訪問數據庫,當試圖
加載的數據不存在時,直接返回null。
(1).如果未發現符合條件的記錄,get()方法返回null,而load方法會拋出一個ObjectNotFoundException
(2).load可返回實體的代理類實例,而get方法永遠直接返回實體類
(3).load()可以充分利用內部緩存和二級緩存中的數據,而get僅僅在內部緩存中進行數據查找,如果沒有發現對應數據,將越過二級緩存,直接調用sql完成數據讀取

(三)比較Hibernate的三種檢索策略優缺點
1.立即檢索
優點:對應用程序完全透明,不管對象處於持久化狀態,還是遊離狀態,應用程序都可以方便的從一個對象導航到與它關聯的對象
缺點:select語句太多,可能會加載應用程序不需要訪問的對象白白浪費許多內存空間
2.延遲檢索
優點:由應用程序決定加載哪些對象,可以避免可執行多餘的select語句,以及避免加載應用程序不需要訪問的對象。因此提高了檢索性能,並且可以節省內存空間
缺點:應用程序如果希望訪問遊離狀態的代理類實例,必須保證它在持久化狀態時已經被初始化
3.迫切左外連接檢索
優點:對應用程序完全透明,不管對象處於持久化狀態還是遊離狀態,應用程序都可以方便的使一個對象導航到與它有關聯的對象。使用了外連接,select語句數目減少
缺點:可能會加載應用程序不需要訪問的對象,白白浪費許多內存空間;複雜的數據表連接也會影響檢索性能

(四)Hibernate都支持哪些緩存策略
1.Read-only:這種策略適用於進行頻繁讀取卻不會更新的數據,這是目前最簡單和最有效的緩存策略
2Read/Write:這種策略適用於需要被更新的數據,比Read-only更耗費資源,在非JTA環境下,每個事務需要在session.close和session.disconnect()被調用
3.Nonstrict read/write:這種策略不保障兩個同時進行的事務會修改同一塊數據,這種策略適用於那些經常讀取但極少更新 的數據
4.Transactional:這種策略時完全事務化的緩存策略,可以用在JTA環境下
(五)Hibernate工作原理以及爲什麼要用?
工作原理:
1.讀取並解析配置文件
2.讀取並解析映射信息,創建SessionFactory
3.打開session
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉session
8.關閉sessionFactory
爲什麼要用?
1.對JDBC訪問數據庫代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼
2.Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現
3.Hibernate使用了java的反射機制,而不是字節碼增強程序來實現透明性
4.Hibernate性能非常好,是一個輕量級框架。映射的靈活性很出色。支持各種關係數據庫,從一對一到對不多各種複雜關係
(六)如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,使用多對一取代
4.配置對象緩存,不適用集合緩存
5.一對多集合使用Bag,多對多集合使用set
6.繼承類使用顯示多態
7.表字段要少,表關聯不要怕多,因爲有二級緩存來撐腰
(七)Hibernate中inverse的作用
在hibernate中,inverse屬性默認是false,就是說關係的兩端都來維護關係。例如Student和Teacher表是多對多關係,用一個TeacherStudent表來維護。
如果Student這邊的reverse=“true”,那麼關係就另一端Teacher來維護,就是說當插入學生時,不會操作TeacherStudent中間表。只有當Teacher插入或者刪除時
纔會除觸發對中間表的操作。所以兩邊不能同時爲reverse="true",因爲會導致任何操作都不觸發對中間表的影響;當兩邊reverse="false"時,也不行,因爲會導致在中間表
中插入兩次關係
(八)什麼是SessionFactory,它是線程安全的嗎?
SessionFactory是Hibernate單例數據存儲是線程安全的,以至於可以多線程同時訪問。一個SessionFactory在啓動時只能創建一次。SessionFactory應該包裝各種單例
以至於它能很簡單的在一個應用代碼中儲存
(九)Spring_Hibernate中委託方案怎麼配置?
解決方案一:按照Object[]數據取出數據,然後自己組裝bean
解決方案二:對每個表的bean寫構造函數,如比如表一要查詢filed1,filed2兩個字段,那麼就有一個構造函數就是Bean(Type1 filed1,Type2 filed2),然後在hql裏面就可以
直接生成這個bean了
(十)Hibernate二級緩存
(1)緩存就是把以前從數據庫中查出來和使用過的對象保存在內存中,這個數據結構通常是或者類似HashMap,當以後要使用某個對象時,先查詢緩存中是否有這個對象
,如果有則使用緩存中的對象,如果沒有則去查詢數據庫,並將數據庫中查詢到的對象保存在緩存中,以便下次使用。
(2)Hibernate的session就是一種緩存,我們通常將之稱爲Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從自己的內部查看是否
存在這個對象,存在則直接返回,不存在就訪問數據庫,並將查到的結果保存在自己的內部。由於session代表一次會話過程,一個Session與一個數據庫連接想關聯,所以
Session最好不要長時間保持打開,通常僅用於一個事務當中,在事務結束時就應該關閉。並且Session是線程不安全的,被多個線程共享時容易出現問題。通常只有那種全
局意義上的緩存纔是真正的緩存應用,纔有比較大的緩存價值,因此Hibernate的Session這一級緩存的緩存作用並不明顯,應用價值不大。Hibernate的二級緩存就是爲
Hibernate配置一種全局緩存,讓多個線程和多個事務共享這個緩存。我們希望時只有一個人使用過,其他人就都可以使用,Session緩存沒有這種效果
(3)二級緩存時獨立於Hibernate的軟件部件,屬於第三方的產品,多個廠商和組織都提供緩存產品,例如EHCache和OSCache等等。在Hibernate中使用二級緩存,搜先
就要在hibernate.cfg.xml配置文件中配置使用哪個廠家的緩存產品,接着需要配置該緩存產品自己的配置文件,最後要配置Hibernate中的哪些實體對象要納入到二級緩存
的管理中。明白了二級緩存的原理和有了這個思路後,很容易配置起Hibernate的二級緩存。擴展知識:一個SessionFactory可以關聯一個二級緩存,也即一個二級緩存只能
負責緩存一個數據庫中的數據,當使用Hibernate的二級緩存後,注意不要有其他的應用或SessionFactory來更改當前數據庫中的數據,這樣的緩存數據就會與數據庫中的
數據不一致

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章