Hibernate學(xué)習(xí)總結(jié)_第1頁
Hibernate學(xué)習(xí)總結(jié)_第2頁
Hibernate學(xué)習(xí)總結(jié)_第3頁
Hibernate學(xué)習(xí)總結(jié)_第4頁
Hibernate學(xué)習(xí)總結(jié)_第5頁
免費預(yù)覽已結(jié)束,剩余5頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Hibernate,倉 J建Configuration 類的實例首先定位映射文檔位置、讀取配置,然后倉建SessionFactory對象語言和操作數(shù)據(jù)庫不匹配:模型不匹配(阻抗不匹配) .可以使用JDBC手動轉(zhuǎn)換;sql參數(shù)和jdbc中用對象賦值 .使用 ORM(Object Relation Mapping對象關(guān)系映射)框架:hibernate二. Hibernate 安裝配置 .配置文件 Hibernate.cfg.xml 禾口 Hperties.映射文件xxx.hbm.xml:對象模型和關(guān)系模型的映射 三.開發(fā)流程1. 由 Domain Object ->

2、mapping -> db2. 有 DB 開始,用工具生成 mapping 和 Domain Object3. 由配置文件開始四. Domain Object 限制1.默認(rèn)的構(gòu)造方法(必須的) 2.有無意義的標(biāo)示符id(主鍵)可選 3.非 final 的,對懶加載有影響 可選Configuration SessionFactory Session Transaction QueryCriteriaConfiguration 類 Configuration 類負(fù)責(zé)配置并啟動SessionFactory對象。在Hibernate的啟動的過程中,對象。SessionFactory接 口Sess

3、io nFactory 接口負(fù)責(zé)初始化 Hibernate。它充當(dāng)數(shù)據(jù)存儲源的代理,并負(fù)責(zé)創(chuàng)建Session對象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常只需要一個Sessio nFactory就夠,當(dāng)需要操作多個數(shù)據(jù)庫時,可以為每個數(shù)據(jù)庫指定一個SessionFactory。Session接口 Session接口負(fù)責(zé)執(zhí)行被持久化對象的CRUD操作 (CRUD 的任務(wù)是完成與數(shù)據(jù)庫的交流,包含了很多常見的 SQL 語 句。)。但需要注意的是Session對象是非線程安全的。同時,Hibernate 的session不同于JSP應(yīng)用

4、中的HttpSession。這里當(dāng)使用session這個 術(shù)語時,其實指的是 Hibernate中的session,而以后會將HttpSession對象稱為用戶 session。Transaction 接口Transaction接口負(fù)責(zé)事務(wù)相關(guān)的操作。它是可選的,開發(fā)人員也可以設(shè)計編寫自己的底層事務(wù)處理代碼Query 和 Criteria 接口Query和Criteria接口負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫查詢。它可以使用HQL語句或 SQL 語句兩種表達(dá)方式。1get和load方法的區(qū)別 load/get方法均可以根據(jù)指定的實體類和id從數(shù)據(jù)庫中讀取記錄,并返回與之對應(yīng)的實體對象 。load返回的是代理對

5、象,不會返回空值;get方法返回實體類;load方法可以充分利用內(nèi)部緩存和二級緩存中現(xiàn)有的數(shù)據(jù),而get方法僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找, 如沒有發(fā)現(xiàn)對應(yīng)的數(shù)據(jù)將越過二級緩存,直接調(diào)用sql完成數(shù)據(jù)讀取。2save方法和persist的區(qū)別save方法在保存的時候如果不開啟事務(wù),數(shù)據(jù)會插入數(shù)據(jù)庫,然后事 務(wù)回滾;persist方法在保存時如果不開啟事務(wù),不會插入數(shù)據(jù)庫數(shù)據(jù);3對象狀態(tài):通過與session和數(shù)據(jù)庫的關(guān)系判斷狀態(tài).瞬時(transient): new出來的對象,跟session和數(shù)據(jù)庫沒有關(guān)系,垃圾回收器會自動回收。持久(Persistent): session內(nèi)部對象,與數(shù)據(jù)庫

6、對應(yīng),數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生變化session會知道。.脫管(detached):不在session內(nèi)部,與數(shù)據(jù)庫中有對應(yīng),數(shù)據(jù)發(fā)生變化session不會知道。脫管狀態(tài)下的數(shù)據(jù)想更新數(shù)據(jù)必須調(diào)用up date語句更新數(shù)據(jù)庫。處于持久態(tài)的對象也稱為 P0(Persistenee Object)瞬時對象和脫管對象也稱為 VO( Value Object)。saveOrU pdate是根據(jù) un save-value的設(shè)定,判定是要 save還是 up date操作1)當(dāng)不知道對象處于什么狀態(tài)時,到底是保存還是更新,可以使用方法 saveOrUpdate;2)原理: hiber nate根據(jù)id判斷,如

7、果數(shù)據(jù)庫有值調(diào)用up date沒有數(shù)據(jù)調(diào)用save;2)saveOrUpdate與merge的區(qū)別:調(diào)用saveOrUpdate對象變成持久對象;調(diào)用merge對象還是脫管的Users.hbm.xmI中的id可以判斷什么時候是瞬時狀態(tài):主鍵判斷:unsaved-value="-1'可以設(shè)置主鍵是-1時候的對象是瞬時的;保存時:判斷unsaved-value的值與保存的id的值,如果兩個值相等 就表示沒保存過,調(diào)用保存數(shù)據(jù);(一般不更改此屬性int:0代表是瞬時對象String: null代表是瞬時對象 evict()清理一集緩存1).查詢?nèi)孔侄蔚那闆r下,如"fro

8、m實體類",list中封裝的對象為實體類本身,各屬性都將得到填充。2).只查詢一個字段,默認(rèn)情況下,list中封裝的是Object對象。3).查詢兩個或兩個以上的字段,默認(rèn)情況下,list中封裝的是Object,長度與所查詢的字段數(shù)一致。對于后兩種情況,用標(biāo)簽遍歷時不太方便,因為無法直接轉(zhuǎn)換成實體 類的對象。比較簡單的解決方法是:在hql中使用select new包名.類名(屬性1,屬性2)from 實體類, 同時在實體類中添加帶參的構(gòu)造方法, 參數(shù)的個數(shù)和順序與(屬性1, 屬性2)保持一致,這樣我們得到的list中存放的依然是實體類 的對象,所查詢到的屬性得到了填充,使用起來更為方

9、便。4、一級緩存的管理當(dāng)應(yīng)用程序調(diào)用 Session的 save() update()、saveOrUpdate() get()或load(),以及調(diào)用查詢接口的list()、iterate()或 filter()方法時,如果在Session緩存中還不存在相應(yīng)的對象,Hibernate就會把該對象加入到第一級緩存中。當(dāng)清理緩存時,Hibernate會根據(jù)緩存中對象的狀態(tài)變化來同步更新數(shù)據(jù)庫。Sessi on為應(yīng)用程序提供了兩個管理緩存的方法:evict(Object obj):從緩存中清除參數(shù)指定的持久化對象。clear():清空緩存中所有持久化對象。二級緩存的管理3.1. Hibernate

10、的二級緩存策略的一般過程如下:1)條件查詢的時候,總是發(fā)出一條 select * from table_name where.(選擇所有字段)這樣的SQL語句查詢數(shù)據(jù)庫,一次獲得 所有的數(shù)據(jù)對象。2) 把獲得的所有數(shù)據(jù)對象根據(jù) ID 放入到第二級緩存中。3)當(dāng)Hibernate根據(jù)ID訪問數(shù)據(jù)對象的時候,首先從Session級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查; 查不到,再查詢數(shù)據(jù)庫,把結(jié)果按照 ID 放入到緩存。4) 刪除、更新、增加數(shù)據(jù)的時候,同時更新緩存。Hibernate的二級緩存策略,是針對于ID查詢的緩存策略,對于條件查詢則毫無作用。為此,Hibernate提

11、供了針對條件查詢的 QueryCache。HQL (Hibernate Query Language):查詢的是對象而不是表,支持多態(tài),對象名是區(qū)分大小寫, java 類和屬性。Query接口處理查詢語句;兩種方法:query.listO :查詢?nèi)拷Y(jié)果集query.uniqueResult()查詢唯一結(jié)果集賦值語句有兩種: 通過 ?號傳遞參數(shù),條件:賦值必須與 ?的位置一致 "from Users as users where =?" query.setString(0, name);.通過:Param賦值,好處是如果hql語句中有多個名字作為參數(shù)是需

12、要賦值一次就可以了"from Users as users where =:name "query.setString("name" , name);Oracle 中的關(guān)鍵字不能作為表名字: 兩種方法:table二” userS'或者用反引號將關(guān)鍵字改為字符串 table二”'user'”字段名處理方式與表名相同。/hql 的分頁查詢,好處是此種方式跨數(shù)據(jù)庫,可以移植的,hibernate會根據(jù)配置方言調(diào)用那種數(shù)據(jù)庫/ 第一條的分頁語句,如: oracle 用rownu m.query.setFirstResu

13、lt(0);記錄從 0開始query.setMaxResults(10);/ 取 10 條條件查詢: Criteria接口調(diào)用 ,對象查詢語句,可以添加約束條件Restrictions:限制、約束類,提供一系列的靜態(tài)方法關(guān)聯(lián)關(guān)系:1、表關(guān)聯(lián)關(guān)系 2、對象關(guān)聯(lián)關(guān)系Hibernate的多對一映射時,many-to-one時指定的column默認(rèn)是映射到關(guān)聯(lián)表的主鍵上(缺?。w現(xiàn)了無意義的id,實現(xiàn)主外鍵關(guān)聯(lián);此標(biāo)簽的column可以不指定,默認(rèn)為和name相同的字段。prop erty-ref:可以指定映射的外鍵是哪個列我們只需要理解對象關(guān)系模型,hibernate會自動處理表之間的關(guān)聯(lián)關(guān) 系。

14、Hibernate的主鍵生成策略 in creme nt:由hibernate自動以遞增的方式生成主鍵;identity :由底層數(shù)據(jù)庫生成標(biāo)識;sequenee Hibernate根據(jù)底層數(shù)據(jù)庫的序列生成標(biāo)示符,要求底層數(shù)據(jù)庫支持序列;hilo : Hibernate根據(jù)high/low算法生成標(biāo)示符;seqhio:使用一個高/低位算法高效的生成long、short或者int類型的標(biāo)示符;native:根據(jù)底層數(shù)據(jù)庫自動生成標(biāo)識符的方式,自動選擇in creme nt、 identity 或者 hilo;uuid.hex: Hibernate采用128位的UUID算法生成標(biāo)示符;uuid.string: UUID被編碼成一個16字符長的字符串;assigned自然主鍵,由Java應(yīng)用程序負(fù)責(zé)生成標(biāo)示符;foreign :使用另外一個相關(guān)聯(lián)的對象的標(biāo)示符;注:映射Set集合屬性時,如果element元素包括not-null= ”true”屬性,則集合屬性表

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論