版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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è)攜帶信息的載體 沒(méi)與session實(shí)例關(guān)聯(lián), 沒(méi)與數(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加載策略舉例說(shuō)明對(duì)象狀態(tài)Sessionsession=sessionFactory.openSession();//開(kāi)啟連接tx=session.beginTransaction();//開(kāi)啟事務(wù)Employeeemp=session.get(Employee.class,123);//根據(jù)主鍵加載emp.setEmpName(“QQ”); //對(duì)持久對(duì)象進(jìn)行更改,不需要更新session.update(emp); //更新,此句沒(méi)有必要mit();session.close();emp.setEmpName(“QQ1”);
//對(duì)脫管對(duì)象進(jìn)行更改Sessionsession2=sessionFactory.openSession();//開(kāi)啟連接tx=session2.beginTransaction();//開(kāi)啟事務(wù)session2.update(emp);…..T05加載策略pubicclassEmpDAO{publicstaticEmployeegetEmployeeById(Integerid) Sessionsession=sessionFactory.openSession();//開(kāi)啟連接tx=session.beginTransaction();//開(kāi)啟事務(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)延遲加載,通過(guò)設(shè)置lazy=”false”、或fetch=”join”實(shí)現(xiàn)立即加載,但一般一對(duì)多盡量設(shè)成lazy=”true”,當(dāng)要實(shí)現(xiàn)立即加載時(shí)通過(guò)HQL語(yǔ)句的預(yù)先抓取joinfetch實(shí)現(xiàn)多對(duì)一默認(rèn)延遲加載,通過(guò)設(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();//不過(guò)采用何種加載方式,這里沒(méi)有錯(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ǔ)句過(guò)多,如果數(shù)據(jù)多的話查詢效率較低2、fetch=”join”,使用連接查詢,減少查詢次數(shù),提交查詢效率下面通過(guò)例子說(shuō)明: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();
//開(kāi)啟連接 tx=session.beginTransaction();//開(kāi)啟事務(wù) Departmentdept=(Department)session.get(Departemt.class,oid); dept.getEmployees.add(emp);//inverse=false mit(); session=HibernateSessionFactory.getSession();
//開(kāi)啟連接 tx=session.beginTransaction();//開(kāi)啟事務(wù)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度生態(tài)旅游場(chǎng)承包經(jīng)營(yíng)合作協(xié)議范本4篇
- 2025年度大棚農(nóng)業(yè)保險(xiǎn)合作協(xié)議3篇
- 二手房交易標(biāo)準(zhǔn)協(xié)議樣本(2024個(gè)人版)版
- 2025年度叉車租賃與租賃物租賃期限調(diào)整合同4篇
- 2025年昌月離婚協(xié)議書婚姻解除及財(cái)產(chǎn)清算范本4篇
- 2025年度航空航天材料質(zhì)量保證協(xié)議4篇
- 2024年重慶地區(qū)標(biāo)準(zhǔn)離婚合同模板一
- 2024私募股權(quán)投資居間協(xié)議
- 專項(xiàng)舞臺(tái)效果策劃與實(shí)施協(xié)議版A版
- 2024年食堂運(yùn)營(yíng)合作協(xié)議標(biāo)準(zhǔn)文本版
- 考級(jí)代理合同范文大全
- 2024解析:第三章物態(tài)變化-講核心(原卷版)
- DB32T 1590-2010 鋼管塑料大棚(單體)通 用技術(shù)要求
- 安全行車知識(shí)培訓(xùn)
- 2024年安徽省高校分類對(duì)口招生考試數(shù)學(xué)試卷真題
- 第12講 語(yǔ)態(tài)一般現(xiàn)在時(shí)、一般過(guò)去時(shí)、一般將來(lái)時(shí)(原卷版)
- 2024年采購(gòu)員年終總結(jié)
- 2024年新疆區(qū)公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 肺動(dòng)脈高壓的護(hù)理查房課件
- 2025屆北京巿通州區(qū)英語(yǔ)高三上期末綜合測(cè)試試題含解析
- 公婆贈(zèng)予兒媳婦的房產(chǎn)協(xié)議書(2篇)
評(píng)論
0/150
提交評(píng)論