第5章 Hibernate高級(jí)特性(理論)_第1頁(yè)
第5章 Hibernate高級(jí)特性(理論)_第2頁(yè)
第5章 Hibernate高級(jí)特性(理論)_第3頁(yè)
第5章 Hibernate高級(jí)特性(理論)_第4頁(yè)
第5章 Hibernate高級(jí)特性(理論)_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第5章章 Hibernate高級(jí)特性高級(jí)特性回顧回顧uHQL檢索方式uHQL檢索步驟 uCriteria檢索方式本章內(nèi)容本章內(nèi)容uHibernate實(shí)體對(duì)象的生命周期 uHibernate緩存 uHibernate檢索策略 本章目標(biāo)本章目標(biāo)u了解Hibernate實(shí)體對(duì)象的生命周期 u掌握Hibernate實(shí)體對(duì)象狀態(tài)變化 u掌握Hibernate緩存的作用 u掌握Hibernate二級(jí)緩存 u掌握Hibernate檢索策略 1. Hibernate實(shí)體對(duì)象的生命周期實(shí)體對(duì)象的生命周期 1.1 Java實(shí)體對(duì)象在JVM中的生命周期 u在Java中可以利用new關(guān)鍵字來(lái)創(chuàng)建一個(gè)對(duì)象。JVM會(huì)為

2、這個(gè)對(duì)象分配一塊內(nèi)存空間,只要這個(gè)變量被引用變量引用,它就一種存在于內(nèi)存中。如果這個(gè)對(duì)象不被任何引用變量引用,它就結(jié)束生命周期1.2 實(shí)體對(duì)象的狀態(tài)實(shí)體對(duì)象的狀態(tài) u實(shí)體對(duì)象的生命周期中包括3種狀態(tài) n臨時(shí)狀態(tài)(transient) n持久化狀態(tài)(persistent) n游離狀態(tài)(detached)1.3 VO與與POu值對(duì)象(VO) :臨時(shí)狀態(tài)和游離狀態(tài)統(tǒng)稱為值對(duì)象(VO) u持久對(duì)象(PO) :處于持久化狀態(tài)的對(duì)象稱為持久對(duì)象(PO) uVO和PO的主要區(qū)別 nVO是相對(duì)獨(dú)立的實(shí)體對(duì)象,處于非管理狀態(tài) n如果一個(gè)PO與其對(duì)應(yīng)的session實(shí)例分離,那么它將從一個(gè)PO變成VO1.4 實(shí)體

3、對(duì)象的狀態(tài)之間的轉(zhuǎn)換實(shí)體對(duì)象的狀態(tài)之間的轉(zhuǎn)換u實(shí)體對(duì)象生命周期的3種狀態(tài)可以相互轉(zhuǎn)換 實(shí)體對(duì)象的狀態(tài)之間的轉(zhuǎn)換實(shí)體對(duì)象的狀態(tài)之間的轉(zhuǎn)換u實(shí)體對(duì)象各種狀態(tài)之間轉(zhuǎn)換的過(guò)程和生命周期的變化 程序代碼對(duì)象什么周期對(duì)象狀態(tài)Dept deptOne = new Dept();deptOne.setDeptName(后勤部);deptOne.setCreateDate(2001-03-02);開(kāi)始生命周期臨時(shí)狀態(tài)session.save(deptOne);處于生命周期轉(zhuǎn)換為持久化狀態(tài)Integer deptId = deptOne.getDeptId();deptOne = null;Dept deptTw

4、o = (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ù)緩存 u緩存是數(shù)據(jù)庫(kù)數(shù)據(jù)在內(nèi)存中的臨時(shí)容器,它包含了數(shù)據(jù)庫(kù)表的數(shù)據(jù)在內(nèi)存中的臨時(shí)拷貝,位于數(shù)據(jù)庫(kù)和數(shù)據(jù)訪問(wèn)層之間 2.2 數(shù)據(jù)緩存的策略數(shù)據(jù)緩存的策略 uORM的數(shù)據(jù)緩存策略包括3種n事務(wù)級(jí)緩存 n

5、應(yīng)用級(jí)緩存n分布式緩存2.3 什么是什么是Hibernate數(shù)據(jù)緩存數(shù)據(jù)緩存 u為了提高性能,Hibernate也使用了緩沖機(jī)制。在Hibernate的框架中,主要包括一級(jí)緩存和二級(jí)緩存uHibernate緩存主要兩個(gè)方面發(fā)生作用n通過(guò)主鍵值加載數(shù)據(jù)n延遲加載2.4 Hibernate一級(jí)緩存一級(jí)緩存 uHibernate一級(jí)緩存由session提供,它的存在和session的生命周期有關(guān),當(dāng)session關(guān)閉的時(shí)候,session管理的一級(jí)緩存也就消失usession提供對(duì)一級(jí)緩存進(jìn)行手工干預(yù)的方法nevict():用于將某個(gè)對(duì)象從session的一級(jí)緩存中清除nclear():用于將一級(jí)緩

6、存中的對(duì)象全部清除Hibernate一級(jí)緩存一級(jí)緩存u一個(gè)Session中不能同時(shí)存在兩個(gè)ID相同的持久化對(duì)象u例如,id為deptId的deptOne對(duì)象已經(jīng)存在Session中,這時(shí)如果Session中試圖產(chǎn)生一個(gè)deptTow對(duì)象Transaction tr = session.beginTransaction();Integer deptId = new Integer(21);Dept deptOne = (Dept)session.get(Dept.class, deptId);Dept deptTow = new Dept();deptTow.setDeptId(deptId);

7、deptTow.setDeptName(采購(gòu)部);deptTow.setCreateDate(2001-04-02);session.update(deptTow);mit();第一個(gè)ID為 deptId對(duì)象第二個(gè)ID為 deptId對(duì)象Hibernate一級(jí)緩存一級(jí)緩存u出現(xiàn)的錯(cuò)誤一個(gè)Session中同時(shí)存在兩個(gè)ID相同的持久化對(duì)象Hibernate一級(jí)緩存一級(jí)緩存u出現(xiàn)這種錯(cuò)誤的主要原因是一個(gè)Session中不能同時(shí)存在兩個(gè)ID相同的持久化對(duì)象,針對(duì)這種錯(cuò)誤,我們可以在程序中加上一個(gè)evict方法,將其中一個(gè)對(duì)象從session中清除 Transaction tr = session.be

8、ginTransaction();Integer deptId = new Integer(21);Dept deptOne = (Dept)session.get(Dept.class, deptId);Dept deptTow = new Dept();deptTow.setDeptId(deptId);deptTow.setDeptName(采購(gòu)部);deptTow.setCreateDate(2001-04-02);session.evict(deptOne); session.update(deptTow);mit();將第一個(gè)ID為 deptId的對(duì)象從緩存中清除Hibernate

9、一級(jí)緩存一級(jí)緩存u調(diào)用clear方法清空一級(jí)緩存中的對(duì)象 Transaction tr = session.beginTransaction();for(int i=0;i10000;i+)Dept deptTow = new Dept();deptTow.setDeptName(采購(gòu)部);deptTow.setCreateDate(2001-04-02);session.save(deptTow);if(i%20 = 0)session.flush();session.clear();mit();session.close();添加20條記錄后清空一級(jí)緩存2.5 Hibernate二級(jí)緩存二

10、級(jí)緩存 uHibernate二級(jí)緩存是一個(gè)可插拔的的緩存插件,由SessionFactory負(fù)責(zé)管理Hibernate二級(jí)緩存二級(jí)緩存uHibernate二級(jí)緩存的工作概括如下 n查詢結(jié)果集為實(shí)體對(duì)象的集合,就把所有實(shí)體對(duì)象根據(jù)ID值放入二級(jí)緩存中n根據(jù)ID查詢,首先從一級(jí)緩存中查找,如果查不到并且配置了二級(jí)緩存,就從二級(jí)緩存中查找,如果還查不到就會(huì)查詢數(shù)據(jù)庫(kù),把結(jié)果按照ID放入緩存中n刪除、更新和增加數(shù)據(jù)時(shí),同時(shí)更新緩存Hibernate二級(jí)緩存二級(jí)緩存u二級(jí)緩存查詢機(jī)制 Hibernate二級(jí)緩存二級(jí)緩存u適合放入Hibernate二級(jí)緩存的數(shù)據(jù)n較少被修改的數(shù)據(jù)n不重要、容許出現(xiàn)偶爾并發(fā)

11、的數(shù)據(jù)n不會(huì)被并發(fā)訪問(wèn)的數(shù)據(jù)n參數(shù)數(shù)據(jù)u不適合放入Hibernate二級(jí)緩存的數(shù)據(jù)n經(jīng)常被修改的數(shù)據(jù)n絕不容許出現(xiàn)并發(fā)的數(shù)據(jù)n與其他應(yīng)用共享的數(shù)據(jù)2.6 Hibernate緩存的應(yīng)用緩存的應(yīng)用 u通過(guò)ID獲得單獨(dú)Java對(duì)象的load方法和get方法nload方法:先查一級(jí)緩存,然后根據(jù)是否存在二級(jí)緩存配置來(lái)查詢二級(jí)緩存,如果仍然獲取不到則在數(shù)據(jù)庫(kù)中獲取,最后將獲取的值填充一級(jí)緩存nget方法: get方法和load方法的區(qū)別在于是否查詢二級(jí)緩存,如果get方法獲得不到指定對(duì)象時(shí)會(huì)直接從數(shù)據(jù)庫(kù)中查詢 Hibernate緩存的應(yīng)用緩存的應(yīng)用uHQL執(zhí)行數(shù)據(jù)庫(kù)的查詢的list方法和iterator

12、方法 nlist方法:首先檢查是否配置了查詢緩存,如果配置了查詢緩存則從查詢緩存中尋找是否已經(jīng)對(duì)該查詢進(jìn)行了緩沖, 否則從數(shù)據(jù)庫(kù)中進(jìn)行獲取。 然后填充一級(jí)緩存、二級(jí)緩存和查詢緩存niterator方法: 首先會(huì)使用查詢語(yǔ)句獲得ID值的列表,然后使用session的load方法獲得所需要對(duì)象的值3. Hibernate檢索策略檢索策略 3.1 Hibernate檢索策略簡(jiǎn)介 uHibernate的檢索策略包括類級(jí)別檢索策略和關(guān)聯(lián)級(jí)別檢索策略n類級(jí)別檢索:立即檢索和延遲檢索 n關(guān)聯(lián)級(jí)別檢索 :立即檢索、延遲檢索和迫切左外連接檢索 3.2 類級(jí)別檢索策略類級(jí)別檢索策略 u立即檢索n類級(jí)別的立即檢索只

13、影響load方法 Testpublic void testQueryLoad1()Dept dept = (Dept)session.load(Dept.class, new Integer(2);類級(jí)別檢索策略類級(jí)別檢索策略u(píng)映射文件 立即檢索類級(jí)別檢索策略類級(jí)別檢索策略u(píng)運(yùn)行結(jié)果立即檢索不管是否用到查詢結(jié)果,都有SQL語(yǔ)句輸出類級(jí)別檢索策略類級(jí)別檢索策略u(píng)延遲檢索 延遲檢索,默認(rèn)是延遲檢索類級(jí)別檢索策略類級(jí)別檢索策略u(píng)延遲檢索返回代理類的實(shí)例具有的特征n它在Hibernate運(yùn)行時(shí)動(dòng)態(tài)生成 n創(chuàng)建代理類實(shí)例的時(shí)候,僅僅初始化了OID屬性,其他屬性都為nulln第一次訪問(wèn)代理類實(shí)例時(shí),Hib

14、ernate會(huì)初始化代理類的實(shí)例 類級(jí)別檢索策略類級(jí)別檢索策略u(píng)顯式初始化代理實(shí)例 Testpublic void testQueryLoad4()Dept dept = (Dept)session.load(Dept.class, new Integer(2);Hibernate.initialize(dept.getDeptName();System.out.println(部門名稱:+dept.getDeptName();顯式地初始化代理實(shí)例3.3 關(guān)聯(lián)級(jí)別檢索策略關(guān)聯(lián)級(jí)別檢索策略 u立即檢索 n設(shè)置一對(duì)多的關(guān)聯(lián)級(jí)別檢索方式為立即檢索 Testpublic void testQueryR

15、aLoad1()Dept dept = (Dept)session.load(Dept.class, new Integer(2);System.out.println(員工名稱:+dept.getDeptName();System.out.println(開(kāi)始檢索員工);System.out.println(部門員工數(shù)量:+dept.getEmployees().size();關(guān)聯(lián)級(jí)別檢索策略關(guān)聯(lián)級(jí)別檢索策略u(píng)映射文件 立即檢索關(guān)聯(lián)級(jí)別檢索策略關(guān)聯(lián)級(jí)別檢索策略u(píng)運(yùn)行結(jié)果u建議:一對(duì)多的關(guān)聯(lián)級(jí)別檢索方式不要使用立即檢索 在輸出結(jié)果前不僅執(zhí)行查詢部門的操作,還查詢員工關(guān)聯(lián)級(jí)別檢索策略關(guān)聯(lián)級(jí)別檢索策略u(píng)延遲檢索 延遲檢索,默認(rèn)為延遲檢索關(guān)聯(lián)級(jí)別檢索策略關(guān)聯(lián)級(jí)別檢索策略u(píng)運(yùn)行結(jié)果當(dāng)用到員工的時(shí)候才查詢員工關(guān)聯(lián)級(jí)別檢索策略關(guān)聯(lián)級(jí)別檢索策略u(píng)迫切左外連接檢索uset節(jié)點(diǎn)的outer-join屬性設(shè)置為trueuHibernate輸出的SQL語(yǔ)句 nselect * from dept dept left join employee emp on dept.dept_id = emp.dept_id and dept

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論