第二部分 Hibernate的底層實現(xiàn)
(一)主鍵生成策略
?????? 主鍵分為自然主鍵(用一個和自身相關(guān)的屬性作為數(shù)據(jù)庫中的主鍵)和代理主鍵(用一個和自身沒有關(guān)系的屬性作為主鍵),Hibernate的主鍵生成策略針對的就是代理主鍵.
主鍵生成策略如下:
數(shù)據(jù)庫如果是MySQL使用identity,如果是Oracle使用sequence,當(dāng)然你如果嫌記得麻煩可以采用native,Hibernate會根據(jù)你的數(shù)據(jù)庫類型自動選擇identity還是sequence.
(二)持久化類
持久化類 = 實體類 + 映射文件
實體類的編寫規(guī)則:(1)需要一個公開的類,公開的無參構(gòu)造
????????????????????????????? (2)私有的屬性,并提供公開的get,set方法
????????????????????????????? (3)需要一個持久化標(biāo)識OID
????????????????????????????? (4)實現(xiàn)Serializable接口
????????????????????????????? (5)實體類不能使用final修飾
????????????????????????????? (6)使用包裝類型替換基本類型(可以避免一些歧異)
(三)Hibernate的緩存機(jī)制
?????? Hibernate將持久化類分為三種狀態(tài):瞬時態(tài),持久態(tài),托管態(tài)(游離態(tài)),區(qū)分這三種狀態(tài)的標(biāo)志就是有沒有和session建立關(guān)系和有沒有id. ?????
?????? Hibernate執(zhí)行save方法之前,也就是對象被保存到數(shù)據(jù)庫前,它沒有id也沒有和session建立關(guān)系,所以他是瞬時態(tài);執(zhí)行方法后有id也和session建立聯(lián)系,所以他是持久態(tài);執(zhí)行close方法后,session被關(guān)閉,他成為托管態(tài).
??????? 持久態(tài)對象會自動更新數(shù)據(jù)庫,是建立在Hibernate的一級緩存基礎(chǔ)上.
??????? Hibernate的緩存是用來提高數(shù)據(jù)庫的訪問效率,分為一級緩存和二級緩存.
? ? ? ? 一級緩存: session級別的緩存,隨著session的創(chuàng)建而創(chuàng)建,隨著session的銷毀而銷毀,程序自帶,不可卸載.一級緩存有一系列的集合(Map<OID,Object>)構(gòu)成的,當(dāng)調(diào)用save,update方法的時候,會存入數(shù)據(jù)庫當(dāng)中,還會放到緩存中一份,當(dāng)調(diào)用get 方法的時候,第一次查詢,先從緩存中取,如果沒有,從數(shù)據(jù)庫中查詢?nèi)缓蠓湃刖彺嬷?第二次查詢,直接返回緩存中的數(shù)據(jù).一級緩存的內(nèi)部結(jié)構(gòu)分為緩存區(qū)和快照區(qū),緩存區(qū)就是存放緩存數(shù)據(jù)的地方,在緩存區(qū)的時候,會順帶著給給這個數(shù)據(jù)來一個副本放入快照區(qū)(拍個照片),對于快照區(qū),里面的數(shù)據(jù),我們程序員修改不了.
??????? 二級緩存:? sessionFactory級別的緩存,不是程序自帶,是插件形式,被redis替代.
(四)Hibernate的事務(wù)控制
事務(wù)的隔離級別
read uncommmit? ? :什么也解決不了? ? ? ? ? ? ? ? 1
read commit ????????? :只能解決臟讀?????????????????? 2
repeatable read? ?? :解決臟讀和不可重復(fù)讀 ? ? 4
serialzable ???????????? :解決所有荣恐,但是不用 ? ? ?? 8
默認(rèn)使用數(shù)據(jù)庫的隔離級別 睬涧,mysql :4
在hibernate當(dāng)中設(shè)置事務(wù)的隔離級別
<property name="hibernate.connection.isolation">4</property>
(五)Hibernate的復(fù)雜查詢
1.Query(使用的是HQL語句來查詢)
HQL:Hibernate Query Language,比較面向?qū)ο蟮牟樵兎绞?和SQL的語法相似,但查詢的對象不再是表和字段,而是實體類和類中的屬性.
使用Session對象的createQuery(String hql)方法
以實體類Customer舉例
查詢?nèi)?
條件查詢:
分頁查詢:
排序查詢:
統(tǒng)計查詢:
投影查詢:
2.Criteria(使用對象和方法來查詢)
QBC:Query By Criteria,是一種更加面向?qū)ο蟮牟樵兎绞?把查詢語句以及條件全部轉(zhuǎn)成了對象的方法.
使用Session對象createCriteria(Class clazz)方法
以實體類Customer舉例
查詢?nèi)?
條件查詢:
分頁查詢:
排序查詢:
統(tǒng)計查詢:
離線查詢:
---------未完待續(xù)---------