版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章Hibernate高級(jí)特性回顧HQL檢索方式HQL檢索步驟Criteria檢索方式本章內(nèi)容Hibernate實(shí)體對(duì)象的生命周期Hibernate緩存Hibernate檢索策略本章目標(biāo)了解Hibernate實(shí)體對(duì)象的生命周期掌握Hibernate實(shí)體對(duì)象狀態(tài)變化掌握Hibernate緩存的作用掌握Hibernate二級(jí)緩存掌握Hibernate檢索策略1.Hibernate實(shí)體對(duì)象的生命周期1.1Java實(shí)體對(duì)象在JVM中的生命周期在Java中可以利用new關(guān)鍵字來創(chuàng)建一個(gè)對(duì)象。JVM會(huì)為這個(gè)對(duì)象分配一塊內(nèi)存空間,只要這個(gè)變量被引用變量引用,它就一種存在于內(nèi)存中。如果這個(gè)對(duì)象不被任何引用變量引用,它就結(jié)束生命周期1.2實(shí)體對(duì)象的狀態(tài)實(shí)體對(duì)象的生命周期中包括3種狀態(tài)臨時(shí)狀態(tài)(transient)持久化狀態(tài)(persistent)游離狀態(tài)(detached)1.3VO與PO值對(duì)象(VO):臨時(shí)狀態(tài)和游離狀態(tài)統(tǒng)稱為值對(duì)象(VO)持久對(duì)象(PO):處于持久化狀態(tài)的對(duì)象稱為持久對(duì)象(PO)VO和PO的主要區(qū)別VO是相對(duì)獨(dú)立的實(shí)體對(duì)象,處于非管理狀態(tài)如果一個(gè)PO與其對(duì)應(yīng)的session實(shí)例分離,那么它將從一個(gè)PO變成VO1.4實(shí)體對(duì)象的狀態(tài)之間的轉(zhuǎn)換實(shí)體對(duì)象生命周期的3種狀態(tài)可以相互轉(zhuǎn)換實(shí)體對(duì)象的狀態(tài)之間的轉(zhuǎn)換實(shí)體對(duì)象各種狀態(tài)之間轉(zhuǎn)換的過程和生命周期的變化程序代碼對(duì)象什么周期對(duì)象狀態(tài)DeptdeptOne=newDept();deptOne.setDeptName("后勤部");deptOne.setCreateDate("2001-03-02");開始生命周期臨時(shí)狀態(tài)session.save(deptOne);處于生命周期轉(zhuǎn)換為持久化狀態(tài)IntegerdeptId=deptOne.getDeptId();deptOne=null;DeptdeptTwo=(Dept)session.load(Dept.class,deptId);mit();處于生命周期處于持久化狀態(tài)session.close();處于生命周期轉(zhuǎn)換為游離態(tài)System.out.println("部門名稱:"+deptTwo.getDeptName());處于生命周期處于游離態(tài)deptTwo=null;生命周期結(jié)束結(jié)束生命周期2.Hibernate緩存2.1什么是數(shù)據(jù)緩存緩存是數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的臨時(shí)容器,它包含了數(shù)據(jù)庫表的數(shù)據(jù)在內(nèi)存中的臨時(shí)拷貝,位于數(shù)據(jù)庫和數(shù)據(jù)訪問層之間2.2數(shù)據(jù)緩存的策略O(shè)RM的數(shù)據(jù)緩存策略包括3種事務(wù)級(jí)緩存應(yīng)用級(jí)緩存分布式緩存2.3什么是Hibernate數(shù)據(jù)緩存為了提高性能,Hibernate也使用了緩沖機(jī)制。在Hibernate的框架中,主要包括一級(jí)緩存和二級(jí)緩存Hibernate緩存主要兩個(gè)方面發(fā)生作用通過主鍵值加載數(shù)據(jù)延遲加載2.4Hibernate一級(jí)緩存Hibernate一級(jí)緩存由session提供,它的存在和session的生命周期有關(guān),當(dāng)session關(guān)閉的時(shí)候,session管理的一級(jí)緩存也就消失session提供對(duì)一級(jí)緩存進(jìn)行手工干預(yù)的方法evict():用于將某個(gè)對(duì)象從session的一級(jí)緩存中清除clear():用于將一級(jí)緩存中的對(duì)象全部清除Hibernate一級(jí)緩存一個(gè)Session中不能同時(shí)存在兩個(gè)ID相同的持久化對(duì)象例如,id為deptId的deptOne對(duì)象已經(jīng)存在Session中,這時(shí)如果Session中試圖產(chǎn)生一個(gè)deptTow對(duì)象Transactiontr=session.beginTransaction();IntegerdeptId=newInteger(21);DeptdeptOne=(Dept)session.get(Dept.class,deptId);DeptdeptTow=newDept();deptTow.setDeptId(deptId);deptTow.setDeptName("采購部");deptTow.setCreateDate("2001-04-02");session.update(deptTow);mit();第一個(gè)ID為deptId對(duì)象第二個(gè)ID為deptId對(duì)象Hibernate一級(jí)緩存出現(xiàn)的錯(cuò)誤一個(gè)Session中同時(shí)存在兩個(gè)ID相同的持久化對(duì)象Hibernate一級(jí)緩存出現(xiàn)這種錯(cuò)誤的主要原因是一個(gè)Session中不能同時(shí)存在兩個(gè)ID相同的持久化對(duì)象,針對(duì)這種錯(cuò)誤,我們可以在程序中加上一個(gè)evict方法,將其中一個(gè)對(duì)象從session中清除Transactiontr=session.beginTransaction();IntegerdeptId=newInteger(21);DeptdeptOne=(Dept)session.get(Dept.class,deptId);DeptdeptTow=newDept();deptTow.setDeptId(deptId);deptTow.setDeptName("采購部");deptTow.setCreateDate("2001-04-02");session.evict(deptOne);session.update(deptTow);mit();將第一個(gè)ID為deptId的對(duì)象從緩存中清除Hibernate一級(jí)緩存調(diào)用clear方法清空一級(jí)緩存中的對(duì)象Transactiontr=session.beginTransaction();for(inti=0;i<10000;i++){ DeptdeptTow=newDept(); deptTow.setDeptName("采購部"); deptTow.setCreateDate("2001-04-02"); session.save(deptTow);
if(i%20==0){ session.flush(); session.clear(); }} mit();session.close();添加20條記錄后清空一級(jí)緩存2.5Hibernate二級(jí)緩存Hibernate二級(jí)緩存是一個(gè)可插拔的的緩存插件,由SessionFactory負(fù)責(zé)管理Hibernate二級(jí)緩存Hibernate二級(jí)緩存的工作概括如下查詢結(jié)果集為實(shí)體對(duì)象的集合,就把所有實(shí)體對(duì)象根據(jù)ID值放入二級(jí)緩存中根據(jù)ID查詢,首先從一級(jí)緩存中查找,如果查不到并且配置了二級(jí)緩存,就從二級(jí)緩存中查找,如果還查不到就會(huì)查詢數(shù)據(jù)庫,把結(jié)果按照ID放入緩存中刪除、更新和增加數(shù)據(jù)時(shí),同時(shí)更新緩存Hibernate二級(jí)緩存二級(jí)緩存查詢機(jī)制Hibernate二級(jí)緩存適合放入Hibernate二級(jí)緩存的數(shù)據(jù)較少被修改的數(shù)據(jù)不重要、容許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)不會(huì)被并發(fā)訪問的數(shù)據(jù)參數(shù)數(shù)據(jù)不適合放入Hibernate二級(jí)緩存的數(shù)據(jù)經(jīng)常被修改的數(shù)據(jù)絕不容許出現(xiàn)并發(fā)的數(shù)據(jù)與其他應(yīng)用共享的數(shù)據(jù)2.6Hibernate緩存的應(yīng)用通過ID獲得單獨(dú)Java對(duì)象的load方法和get方法load方法:先查一級(jí)緩存,然后根據(jù)是否存在二級(jí)緩存配置來查詢二級(jí)緩存,如果仍然獲取不到則在數(shù)據(jù)庫中獲取,最后將獲取的值填充一級(jí)緩存get方法:get方法和load方法的區(qū)別在于是否查詢二級(jí)緩存,如果get方法獲得不到指定對(duì)象時(shí)會(huì)直接從數(shù)據(jù)庫中查詢Hibernate緩存的應(yīng)用HQL執(zhí)行數(shù)據(jù)庫的查詢的list方法和iterator方法list方法:首先檢查是否配置了查詢緩存,如果配置了查詢緩存則從查詢緩存中尋找是否已經(jīng)對(duì)該查詢進(jìn)行了緩沖,否則從數(shù)據(jù)庫中進(jìn)行獲取。然后填充一級(jí)緩存、二級(jí)緩存和查詢緩存iterator方法:首先會(huì)使用查詢語句獲得ID值的列表,然后使用session的load方法獲得所需要對(duì)象的值3.Hibernate檢索策略3.1Hibernate檢索策略簡(jiǎn)介Hibernate的檢索策略包括類級(jí)別檢索策略和關(guān)聯(lián)級(jí)別檢索策略類級(jí)別檢索:立即檢索和延遲檢索關(guān)聯(lián)級(jí)別檢索:立即檢索、延遲檢索和迫切左外連接檢索3.2類級(jí)別檢索策略立即檢索類級(jí)別的立即檢索只影響load方法@TestpublicvoidtestQueryLoad1(){ Deptdept=(Dept)session.load(Dept.class,newInteger(2));}類級(jí)別檢索策略映射文件<hibernate-mapping><classname="com.hr.g3.persist.Dept"lazy="false"table="dept" catalog="hqt_t1"><idname="deptId"type="java.lang.Integer"><columnname="DEPT_ID"/><generatorclass="native"/></id><setname="employees"inverse="true"><key><columnname="DEPT_ID"/></key><one-to-manyclass="com.hr.g3.persist.Employee"/></set></class></hibernate-mapping>立即檢索類級(jí)別檢索策略運(yùn)行結(jié)果立即檢索不管是否用到查詢結(jié)果,都有SQL語句輸出類級(jí)別檢索策略延遲檢索<hibernate-mapping><classname="com.hr.g3.persist.Dept"lazy=“true"table="dept" catalog="hqt_t1"><idname="deptId"type="java.lang.Integer"><columnname="DEPT_ID"/><generatorclass="native"/></id><setname="employees"inverse="true"><key><columnname="DEPT_ID"/></key><one-to-manyclass="com.hr.g3.persist.Employee"/></set></class></hibernate-mapping>延遲檢索,默認(rèn)是延遲檢索類級(jí)別檢索策略延遲檢索返回代理類的實(shí)例具有的特征它在Hibernate運(yùn)行時(shí)動(dòng)態(tài)生成創(chuàng)建代理類實(shí)例的時(shí)候,僅僅初始化了OID屬性,其他屬性都為null第一次訪問代理類實(shí)例時(shí),Hibernate會(huì)初始化代理類的實(shí)例類級(jí)別檢索策略顯式初始化代理實(shí)例@TestpublicvoidtestQueryLoad4(){ Deptdept=(Dept)session.load(Dept.class,newInteger(2)); Hibernate.initialize(dept.getDeptName()); System.out.println("部門名稱:"+dept.getDeptName());}顯式地初始化代理實(shí)例3.3關(guān)聯(lián)級(jí)別檢索策略立即檢索設(shè)置一對(duì)多的關(guān)聯(lián)級(jí)別檢索方式為立即檢索@TestpublicvoidtestQueryRaLoad1(){ Deptdept=(Dept)session.load(Dept.class,newInteger(2)); System.out.println("員工名稱:"+dept.getDeptName()); System.out.println("開始檢索員工"); System.out.println("部門員工數(shù)量:"+dept.getEmployees().size()); }關(guān)聯(lián)級(jí)別檢索策略映射文件<hibernate-mapping><classname="com.hr.g3.persist.Dept"lazy="true"table="dept" catalog="hqt_t1"><idname="deptId"type="java.lang.Integer"><columnname="DEPT_ID"/><generatorclass="native"/></id><setname="employees"lazy="false"><key><columnname="DEPT_ID"/></key><one-to-manyclass="com.hr.g3.persist.Employee"/></set></class></hibernate-mapping>立即檢索關(guān)聯(lián)級(jí)別檢索策略運(yùn)行結(jié)果建議:一對(duì)多的關(guān)聯(lián)級(jí)別檢索方式不要使用立即檢索在輸出結(jié)果前不僅執(zhí)行查詢部門的操作,還查詢員工關(guān)聯(lián)級(jí)別檢索策略延遲檢索<hibernate-mapping><classname="com.hr.g3.persist.Dept"lazy="true"table="dept"catalog="hqt_t1"><idname="deptId"type="java.lang.Integer"><columnname="DEPT_ID"/><generatorclass="native"/></id><setname="employees"lazy="true"inverse="true"><key><columnname="DEPT_ID"/></key><one-to-manyclass="com.hr.g3.persist.Employee"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 雅安市高2022級(jí)(2025屆)高三“零診”考試 語文試卷(含標(biāo)準(zhǔn)答案)
- 養(yǎng)老護(hù)理員初級(jí)培訓(xùn)
- 中考數(shù)學(xué)二輪復(fù)習(xí)專項(xiàng)選擇題題組集訓(xùn)二課件
- 防疫培訓(xùn)幼兒園
- 2024-2025學(xué)年貴州省六盤水市水城區(qū)高二上學(xué)期期中質(zhì)量監(jiān)測(cè)數(shù)學(xué)試卷(含答案)
- T-ZFDSA 20-2024 蜂蜜蒸梨制作標(biāo)準(zhǔn)
- 山東省菏澤市鄆城一中2024-2025學(xué)年九年級(jí)上學(xué)期第一次月考數(shù)學(xué)試題
- 03Z028安全環(huán)保部安全管理員工作標(biāo)準(zhǔn)
- 人教版六年級(jí)語文下冊(cè)兩小兒辯日
- 高中語文第5單元散而不亂氣脈中貫3祭十二郞文課件新人教版選修中國古代詩歌散文欣賞
- 橋梁冬季施工方案及措施
- 職高數(shù)學(xué)《等差數(shù)列》試卷試題
- 急性胸痛的急診處理ppt課件
- 砂礦采樣規(guī)范手冊(cè).docx
- 實(shí)驗(yàn)檢測(cè)生物組織中的糖類脂肪和蛋白質(zhì)PPT課件
- 聚乙烯PE管道施工方案完整
- 流動(dòng)資金貸款需求量測(cè)算參考計(jì)算表(XLS12)
- 西師大版六年級(jí)數(shù)學(xué)上冊(cè)期中測(cè)試卷(附答案)
- 崗位價(jià)值評(píng)估方法(共15頁)
- 202X年婦聯(lián)赴外出學(xué)習(xí)考察心得體會(huì).doc
- suzuki偶聯(lián)反應(yīng)(課堂PPT)
評(píng)論
0/150
提交評(píng)論