T05-加載策略課件_第1頁(yè)
T05-加載策略課件_第2頁(yè)
T05-加載策略課件_第3頁(yè)
T05-加載策略課件_第4頁(yè)
T05-加載策略課件_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

T05加載策略2024/4/17T05加載策略課程目標(biāo)對(duì)象在Hibernate中的狀態(tài)加載策略介紹lazy=”false”與fetch=

“join”的區(qū)別inverse=”true”insert=”false”update=”false”T05加載策略對(duì)象在Hibernate中的狀態(tài)臨時(shí)狀態(tài) 普通的Java對(duì)象,只是一個(gè)攜帶信息的載體 沒與session實(shí)例關(guān)聯(lián), 沒與數(shù)據(jù)庫(kù)中記錄關(guān)聯(lián)持久狀態(tài) 持久實(shí)例在數(shù)據(jù)庫(kù)中 有對(duì)應(yīng)的記錄, 并擁有持久化標(biāo)識(shí), 持久實(shí)例可能是剛剛被保存, 或剛剛被加載的數(shù)據(jù)脫管狀態(tài) 持久對(duì)象關(guān)聯(lián)的Session關(guān)閉后, 對(duì)象變?yōu)槊摴躶aveOrUpdate()?臨時(shí)狀態(tài)持久狀態(tài)脫管狀態(tài)get()?load()?find()?iterator()?save()?update()?delete()?close()?clear()?update()?evict()?delete()?T05加載策略舉例說明對(duì)象狀態(tài)Sessionsession=sessionFactory.openSession();//開啟連接tx=session.beginTransaction();//開啟事務(wù)Employeeemp=session.get(Employee.class,123);//根據(jù)主鍵加載emp.setEmpName(“QQ”); //對(duì)持久對(duì)象進(jìn)行更改,不需要更新session.update(emp); //更新,此句沒有必要mit();session.close();emp.setEmpName(“QQ1”);

//對(duì)脫管對(duì)象進(jìn)行更改Sessionsession2=sessionFactory.openSession();//開啟連接tx=session2.beginTransaction();//開啟事務(wù)session2.update(emp);…..T05加載策略pubicclassEmpDAO{publicstaticEmployeegetEmployeeById(Integerid) Sessionsession=sessionFactory.openSession();//開啟連接tx=session.beginTransaction();//開啟事務(wù)Employeeemp=(Employee)session.get(Employee.class,id);//根據(jù)主鍵加載mit();session.close();......忽略了異常處理returnemp;}Employeeemp=EmpDAO.getEmployeeById(10011);//此時(shí)emp是什么狀態(tài)??emp.setEmpName(“AA”);//數(shù)據(jù)庫(kù)中empName值是什么?T05加載策略加載策略介紹我們知道,Hiberante是一個(gè)ORM工具,它使得我們能夠直接去操縱對(duì)象而不是數(shù)據(jù)庫(kù)中表。Hibernate的數(shù)據(jù)檢索策略也是給予對(duì)對(duì)象的操作的。數(shù)據(jù)檢索策略主要包括一下幾種:立即加載,延遲加載,預(yù)先抓取和批量加載。其中前三個(gè)是統(tǒng)一級(jí)別的,三個(gè)當(dāng)中智能選擇其中一個(gè),而批量加載則可以很好的整合前面三個(gè),還有就是預(yù)先抓取和批量加載都是為了優(yōu)化前面兩種方式而形成的。同時(shí)對(duì)于配置文件中的某個(gè)屬性一旦設(shè)為預(yù)先抓取,則其它的數(shù)據(jù)檢索方式都對(duì)這個(gè)屬性失效。

下面分別進(jìn)行討論:

1立即檢索:立即檢索的時(shí)候需要在配置文件添加屬性lazy="false".當(dāng)Hibernate在從數(shù)據(jù)庫(kù)中取得字段值組裝好一個(gè)對(duì)象后,會(huì)立即再組裝此對(duì)象所關(guān)聯(lián)的對(duì)象,如果這個(gè)對(duì)象還有關(guān)聯(lián)對(duì)象,再組裝這個(gè)關(guān)聯(lián)對(duì)象;對(duì)于一對(duì)一和多對(duì)一的多的這段默認(rèn)是采用立即加載,所以不需要配置;多對(duì)多和一對(duì)多就要配置lazy="false"。

2延遲加載:延遲加載不同,當(dāng)組裝完一個(gè)對(duì)象后,不立即組裝和它關(guān)聯(lián)的對(duì)象。多對(duì)多和一對(duì)多默認(rèn)采用延遲加載,一對(duì)一和多對(duì)一想實(shí)現(xiàn)延遲加載得配置lazy="true"。

3預(yù)先抓?。篐ibernate2.x版本:outer-join="true"Hibernate3.x版本:fetch="join"。和立即檢索相比,預(yù)先抓取可以減少SQL語(yǔ)句的條數(shù),提高查詢速度。

4批量加載:批量加載總是和立即加載或者延遲加載聯(lián)系在一起的,分別為批量立即加載和批量延遲加載。T05加載策略Hibernate加載策略為了提高效率,節(jié)省資源,提供了多種數(shù)據(jù)檢索策略立即加載延遲加載預(yù)先抓取批量加載同時(shí)使用同時(shí)使用T05加載策略立即加載從數(shù)據(jù)庫(kù)取得字段值組裝好一個(gè)對(duì)象后,會(huì)立即從數(shù)據(jù)庫(kù)取出關(guān)聯(lián)的附屬對(duì)象,脫離Session后仍可以使用這些附屬對(duì)象立即加載的適用情況:加載對(duì)象時(shí),馬上就要用到附屬對(duì)象的數(shù)據(jù)一對(duì)一、多對(duì)一被關(guān)聯(lián)對(duì)象是”一”這端的立即加載的配置為lazy=“false”一對(duì)一、多對(duì)一默認(rèn)就是立即加載,所以只有一對(duì)多、多對(duì)多的立即加載需要在<set>元素中指定lazy=“false”T05加載策略延遲加載從數(shù)據(jù)庫(kù)取得字段值組裝好一個(gè)對(duì)象后,并不會(huì)立即取出附屬對(duì)象。這樣做通常是為了節(jié)約內(nèi)存資源因?yàn)橐粚?duì)多、多對(duì)多關(guān)系如果設(shè)置為立即加載,將有可能會(huì)加載很多的附屬對(duì)象而占據(jù)大量?jī)?nèi)存,因此這種情況常設(shè)置為延遲加載多對(duì)一、一對(duì)一設(shè)置延遲加載只需在<set>標(biāo)簽中設(shè)置lazy=“true”T05加載策略加載策略舉例一對(duì)一默認(rèn)立即加載、一般不改動(dòng)一對(duì)多默認(rèn)延遲加載,通過設(shè)置lazy=”false”、或fetch=”join”實(shí)現(xiàn)立即加載,但一般一對(duì)多盡量設(shè)成lazy=”true”,當(dāng)要實(shí)現(xiàn)立即加載時(shí)通過HQL語(yǔ)句的預(yù)先抓取joinfetch實(shí)現(xiàn)多對(duì)一默認(rèn)延遲加載,通過設(shè)置lazy=”false”或fetch=”join”實(shí)現(xiàn)立即加載下面以部門加載員工(一對(duì)多)為例:T05加載策略部門對(duì)員工的加載策略配置如下:<classname=“demo.bean.Department"table="Department"><setname="employees"cascade="all"lazy=“true"inverse="true"><keycolumn="deptid"></key><one-to-manyclass=“demo.bean.Employee"/></set></class>false:加載部門時(shí)立即加載員工true:加載部門時(shí)不加載員工<classname=“demo.bean.Employee"table="Employee"><many-to-onename="dept"class=“demo.bean.Department"column="deptid"lazy="false"></many-to-one></class>T05加載策略//根據(jù)部門OID查找部門publicDepartmentgetDeptById(Integeroid){Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Departmentdept=(Department)session.get(Depaertment.class,oid);Setemps=dept.getEmployees();//不過采用何種加載方式,這里沒有錯(cuò)誤mit();session.close();returndept;Setemps=dept.getEmployees();//如果lazy=“true”,這里將出錯(cuò)}T05加載策略顯示部門詳細(xì)信息如果部門對(duì)員工采用的是延遲加載,那么這里將會(huì)出錯(cuò)T05加載策略lazy=”false”與fetch=

“join”的區(qū)別

1、lazy=”false”,立即加載,一次只查一個(gè)表。產(chǎn)生語(yǔ)句過多,如果數(shù)據(jù)多的話查詢效率較低2、fetch=”join”,使用連接查詢,減少查詢次數(shù),提交查詢效率下面通過例子說明:T05加載策略lazy=”false”部門對(duì)員工采用lazy=”false”立即加載員工的配置及代碼:

<setname="employees"inverse="true"cascade="all"

lazy="false">

<keycolumn="deptid"></key>

<one-to-manyclass=“demo.bean.Employee"/>

</set>publicstaticvoidmain(Stringargs[]){

Sessionsession=HibernateSessionFactory.getSession();

Transactiontx=session.beginTransaction();

Departmentdept=(Department)session.get(Department.class,51);

mit();

session.close();

System.out.println("部門名稱:"+dept.getDeptName());

Setemps=dept.getEmployees();

for(Iteratoriter=emps.iterator();iter.hasNext();){

Employeeemp=(Employee)iter.next();

System.out.println("員工名字:"+emp.getEmpName());

}

}T05加載策略lazy=”false”執(zhí)行main方法,得到控制臺(tái)信息:T05加載策略fetch="join"部門對(duì)員工采用fetch="join"預(yù)先抓取員工的配置及代碼:

<setname="employees"inverse="true"cascade="all"

fetch=“join”>

<keycolumn="deptid"></key>

<one-to-manyclass=“demo.bean.Employee"/>

</set>publicstaticvoidmain(Stringargs[]){

Sessionsession=HibernateSessionFactory.getSession();

Transactiontx=session.beginTransaction();

Departmentdept=(Department)session.get(Department.class,51);

mit();

session.close();

System.out.println("部門名稱:"+dept.getDeptName());

Setemps=dept.getEmployees();

for(Iteratoriter=emps.iterator();iter.hasNext();){

Employeeemp=(Employee)iter.next();

System.out.println("員工名字:"+emp.getEmpName());

}

}T05加載策略fetch="join"執(zhí)行main方法,得到控制臺(tái)信息:我們可以很明顯的看出,查詢同樣的數(shù)據(jù),采用fetch=“join”比用lazy=“false”少了兩條語(yǔ)句,提高了查詢效率;當(dāng)然,數(shù)據(jù)量越多,減少的sql語(yǔ)句就越多這里還得注意,如果你使用了fetch=“join”,那么HQL語(yǔ)句會(huì)忽略配置文件中的立即加載(當(dāng)部門對(duì)員工fetch=”join”并且使用HQL語(yǔ)句”fromDepartment”不會(huì)取出員工)。

T05加載策略inverse屬性inverse屬性表示將關(guān)系轉(zhuǎn)由對(duì)方維護(hù) session=HibernateSessionFactory.getSession();

//開啟連接 tx=session.beginTransaction();//開啟事務(wù) Departmentdept=(Department)session.get(Departemt.class,oid); dept.getEmployees.add(emp);//inverse=false mit(); session=HibernateSessionFactory.getSession();

//開啟連接 tx=session.beginTransaction();//開啟事務(wù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論