版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章Hibernate高級特性回顧HQL檢索方式HQL檢索步驟Criteria檢索方式本章內(nèi)容Hibernate實體對象的生命周期Hibernate緩存Hibernate檢索策略本章目標了解Hibernate實體對象的生命周期掌握Hibernate實體對象狀態(tài)變化掌握Hibernate緩存的作用掌握Hibernate二級緩存掌握Hibernate檢索策略1.Hibernate實體對象的生命周期1.1Java實體對象在JVM中的生命周期在Java中可以利用new關(guān)鍵字來創(chuàng)建一個對象。JVM會為這個對象分配一塊內(nèi)存空間,只要這個變量被引用變量引用,它就一種存在于內(nèi)存中。如果這個對象不被任何引用變量引用,它就結(jié)束生命周期1.2實體對象的狀態(tài)實體對象的生命周期中包括3種狀態(tài)臨時狀態(tài)(transient)持久化狀態(tài)(persistent)游離狀態(tài)(detached)1.3VO與PO值對象(VO):臨時狀態(tài)和游離狀態(tài)統(tǒng)稱為值對象(VO)持久對象(PO):處于持久化狀態(tài)的對象稱為持久對象(PO)VO和PO的主要區(qū)別VO是相對獨立的實體對象,處于非管理狀態(tài)如果一個PO與其對應(yīng)的session實例分離,那么它將從一個PO變成VO1.4實體對象的狀態(tài)之間的轉(zhuǎn)換實體對象生命周期的3種狀態(tài)可以相互轉(zhuǎn)換實體對象的狀態(tài)之間的轉(zhuǎn)換實體對象各種狀態(tài)之間轉(zhuǎn)換的過程和生命周期的變化程序代碼對象什么周期對象狀態(tài)DeptdeptOne=newDept();deptOne.setDeptName("后勤部");deptOne.setCreateDate("2001-03-02");開始生命周期臨時狀態(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ù)據(jù)庫表的數(shù)據(jù)在內(nèi)存中的臨時拷貝,位于數(shù)據(jù)庫和數(shù)據(jù)訪問層之間2.2數(shù)據(jù)緩存的策略O(shè)RM的數(shù)據(jù)緩存策略包括3種事務(wù)級緩存應(yīng)用級緩存分布式緩存2.3什么是Hibernate數(shù)據(jù)緩存為了提高性能,Hibernate也使用了緩沖機制。在Hibernate的框架中,主要包括一級緩存和二級緩存Hibernate緩存主要兩個方面發(fā)生作用通過主鍵值加載數(shù)據(jù)延遲加載2.4Hibernate一級緩存Hibernate一級緩存由session提供,它的存在和session的生命周期有關(guān),當session關(guān)閉的時候,session管理的一級緩存也就消失session提供對一級緩存進行手工干預(yù)的方法evict():用于將某個對象從session的一級緩存中清除clear():用于將一級緩存中的對象全部清除Hibernate一級緩存一個Session中不能同時存在兩個ID相同的持久化對象例如,id為deptId的deptOne對象已經(jīng)存在Session中,這時如果Session中試圖產(chǎn)生一個deptTow對象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();第一個ID為deptId對象第二個ID為deptId對象Hibernate一級緩存出現(xiàn)的錯誤一個Session中同時存在兩個ID相同的持久化對象Hibernate一級緩存出現(xiàn)這種錯誤的主要原因是一個Session中不能同時存在兩個ID相同的持久化對象,針對這種錯誤,我們可以在程序中加上一個evict方法,將其中一個對象從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();將第一個ID為deptId的對象從緩存中清除Hibernate一級緩存調(diào)用clear方法清空一級緩存中的對象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條記錄后清空一級緩存2.5Hibernate二級緩存Hibernate二級緩存是一個可插拔的的緩存插件,由SessionFactory負責管理Hibernate二級緩存Hibernate二級緩存的工作概括如下查詢結(jié)果集為實體對象的集合,就把所有實體對象根據(jù)ID值放入二級緩存中根據(jù)ID查詢,首先從一級緩存中查找,如果查不到并且配置了二級緩存,就從二級緩存中查找,如果還查不到就會查詢數(shù)據(jù)庫,把結(jié)果按照ID放入緩存中刪除、更新和增加數(shù)據(jù)時,同時更新緩存Hibernate二級緩存二級緩存查詢機制Hibernate二級緩存適合放入Hibernate二級緩存的數(shù)據(jù)較少被修改的數(shù)據(jù)不重要、容許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)不會被并發(fā)訪問的數(shù)據(jù)參數(shù)數(shù)據(jù)不適合放入Hibernate二級緩存的數(shù)據(jù)經(jīng)常被修改的數(shù)據(jù)絕不容許出現(xiàn)并發(fā)的數(shù)據(jù)與其他應(yīng)用共享的數(shù)據(jù)2.6Hibernate緩存的應(yīng)用通過ID獲得單獨Java對象的load方法和get方法load方法:先查一級緩存,然后根據(jù)是否存在二級緩存配置來查詢二級緩存,如果仍然獲取不到則在數(shù)據(jù)庫中獲取,最后將獲取的值填充一級緩存get方法:get方法和load方法的區(qū)別在于是否查詢二級緩存,如果get方法獲得不到指定對象時會直接從數(shù)據(jù)庫中查詢Hibernate緩存的應(yīng)用HQL執(zhí)行數(shù)據(jù)庫的查詢的list方法和iterator方法list方法:首先檢查是否配置了查詢緩存,如果配置了查詢緩存則從查詢緩存中尋找是否已經(jīng)對該查詢進行了緩沖,否則從數(shù)據(jù)庫中進行獲取。然后填充一級緩存、二級緩存和查詢緩存iterator方法:首先會使用查詢語句獲得ID值的列表,然后使用session的load方法獲得所需要對象的值3.Hibernate檢索策略3.1Hibernate檢索策略簡介Hibernate的檢索策略包括類級別檢索策略和關(guān)聯(lián)級別檢索策略類級別檢索:立即檢索和延遲檢索關(guān)聯(lián)級別檢索:立即檢索、延遲檢索和迫切左外連接檢索3.2類級別檢索策略立即檢索類級別的立即檢索只影響load方法@TestpublicvoidtestQueryLoad1(){ Deptdept=(Dept)session.load(Dept.class,newInteger(2));}類級別檢索策略映射文件<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>立即檢索類級別檢索策略運行結(jié)果立即檢索不管是否用到查詢結(jié)果,都有SQL語句輸出類級別檢索策略延遲檢索<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>延遲檢索,默認是延遲檢索類級別檢索策略延遲檢索返回代理類的實例具有的特征它在Hibernate運行時動態(tài)生成創(chuàng)建代理類實例的時候,僅僅初始化了OID屬性,其他屬性都為null第一次訪問代理類實例時,Hibernate會初始化代理類的實例類級別檢索策略顯式初始化代理實例@TestpublicvoidtestQueryLoad4(){ Deptdept=(Dept)session.load(Dept.class,newInteger(2)); Hibernate.initialize(dept.getDeptName()); System.out.println("部門名稱:"+dept.getDeptName());}顯式地初始化代理實例3.3關(guān)聯(lián)級別檢索策略立即檢索設(shè)置一對多的關(guān)聯(lián)級別檢索方式為立即檢索@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)級別檢索策略映射文件<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)級別檢索策略運行結(jié)果建議:一對多的關(guān)聯(lián)級別檢索方式不要使用立即檢索在輸出結(jié)果前不僅執(zhí)行查詢部門的操作,還查詢員工關(guān)聯(lián)級別檢索策略延遲檢索<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等.壓縮文件請下載最新的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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人教新課標九年級科學上冊階段測試試卷含答案
- 2025年外研版三年級起點必修2化學下冊月考試卷含答案
- 2025年滬教版必修2物理上冊月考試卷含答案
- 船舶出租協(xié)議范本
- 音樂著作權(quán)專有使用許可協(xié)議
- 2025年上教版選擇性必修2生物上冊階段測試試卷含答案
- 2025年華東師大版高三地理上冊月考試卷含答案
- 2025至2031年中國地面刮水器行業(yè)投資前景及策略咨詢研究報告
- 2025年北師大版七年級科學下冊月考試卷含答案
- 2025至2030年中國防彈夾層玻璃數(shù)據(jù)監(jiān)測研究報告
- 餐飲行業(yè)智慧餐廳管理系統(tǒng)方案
- 2025年度生物醫(yī)藥技術(shù)研發(fā)與許可協(xié)議3篇
- 電廠檢修安全培訓課件
- 殯葬改革課件
- 血壓計保養(yǎng)記錄表
- 食品的售后服務(wù)承諾書范本范文(通用3篇)
- 新外研版九年級上冊(初三)英語全冊教學課件PPT
- 初中中考英語總復(fù)習《代詞動詞連詞數(shù)詞》思維導圖
- 植物和五行關(guān)系解說
- 滬教牛津版初中英語七年級下冊全套單元測試題
- 因式分解法提公因式法公式法
評論
0/150
提交評論