




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、加載策略課課 程程 目標(biāo)目標(biāo)對(duì)象在Hibernate中的狀態(tài)加載策略介紹lazy=”false”與fetch= “join”的區(qū)別 inverse=”true” insert=”false” update=”false” 對(duì)象在對(duì)象在HibernateHibernate中的狀態(tài)中的狀態(tài)臨時(shí)狀態(tài)普通的普通的JavaJava對(duì)象,只是一個(gè)攜帶信息的載體對(duì)象,只是一個(gè)攜帶信息的載體沒(méi)與沒(méi)與sessionsession實(shí)例關(guān)聯(lián),實(shí)例關(guān)聯(lián),沒(méi)與數(shù)據(jù)庫(kù)中記錄關(guān)聯(lián)沒(méi)與數(shù)據(jù)庫(kù)中記錄關(guān)聯(lián)持久狀態(tài)持久實(shí)例在數(shù)據(jù)庫(kù)中持久實(shí)例在數(shù)據(jù)庫(kù)中有對(duì)應(yīng)的記錄,有對(duì)應(yīng)的記錄,并擁有持久化標(biāo)識(shí),并擁有持久化標(biāo)識(shí),持久實(shí)例可能是剛剛
2、被保存,持久實(shí)例可能是剛剛被保存,或剛剛被加載的數(shù)據(jù)或剛剛被加載的數(shù)據(jù)脫管狀態(tài)持久對(duì)象關(guān)聯(lián)的持久對(duì)象關(guān)聯(lián)的SessionSession關(guān)閉后,關(guān)閉后,對(duì)象變?yōu)槊摴軐?duì)象變?yōu)槊摴躶aveOrUpdate()?臨時(shí)狀態(tài)臨時(shí)狀態(tài)持久狀態(tài)持久狀態(tài)脫管狀態(tài)脫管狀態(tài)get()?load()?find()?iterator()?save()?update()?delete()?close()?clear()?update()?evict()?delete()?舉例說(shuō)明對(duì)象狀態(tài)舉例說(shuō)明對(duì)象狀態(tài)Session session = sessionFactory.openSession(); /開(kāi)啟連接開(kāi)啟連接tx
3、= session.beginTransaction(); /開(kāi)啟事務(wù)開(kāi)啟事務(wù)Employee emp = session.get(Employee.class, 123); /根據(jù)主鍵加載根據(jù)主鍵加載emp.setEmpName(“QQ”);/對(duì)持久對(duì)象進(jìn)行更改,不需要更新對(duì)持久對(duì)象進(jìn)行更改,不需要更新session.update(emp);/更新,此句沒(méi)有必要更新,此句沒(méi)有必要mit();session.close();emp.setEmpName(“QQ1”); /對(duì)脫管對(duì)象進(jìn)行更改對(duì)脫管對(duì)象進(jìn)行更改Session session2 = sessionFactory.openSessio
4、n(); /開(kāi)啟連接開(kāi)啟連接tx = session2.beginTransaction(); /開(kāi)啟事務(wù)開(kāi)啟事務(wù)session2.update(emp);.pubic class EmpDAOpublic static Employee getEmployeeById(Integer id) Session session = sessionFactory.openSession(); /開(kāi)啟連接開(kāi)啟連接tx = session.beginTransaction(); /開(kāi)啟事務(wù)開(kāi)啟事務(wù)Employee emp = (Employee)session.get(Employee.class,
5、id); /根據(jù)主鍵加載根據(jù)主鍵加載mit();session.close();. 忽略了異常處理忽略了異常處理return emp;Employee emp = EmpDAO.getEmployeeById(10011) ;/此時(shí)此時(shí)emp是什么狀態(tài)?是什么狀態(tài)?emp.setEmpName(“AA”);/數(shù)據(jù)庫(kù)中數(shù)據(jù)庫(kù)中empName值是什么?值是什么?加載策略介紹加載策略介紹我們知道,Hiberante是一個(gè)ORM工具,它使得我們能夠直接去操縱對(duì)象而不是數(shù)據(jù)庫(kù)中表。Hibernate的數(shù)據(jù)檢索策略也是給予對(duì)對(duì)象的操作的。數(shù)據(jù)檢索策略主要包括一下幾種:立即加載,延遲加載,預(yù)先抓取和批量加載
6、。其中前三個(gè)是統(tǒng)一級(jí)別的,三個(gè)當(dāng)中智能選擇其中一個(gè),而批量加載則可以很好的整合前面三個(gè),還有就是預(yù)先抓取和批量加載都是為了優(yōu)化前面兩種方式而形成的。同時(shí)對(duì)于配置文件中的某個(gè)屬性一旦設(shè)為預(yù)先抓取,則其它的數(shù)據(jù)檢索方式都對(duì)這個(gè)屬性失效。 下面分別進(jìn)行討論: 1 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 2 延遲
7、加載延遲加載:延遲加載不同,當(dāng)組裝完一個(gè)對(duì)象后,不立即組裝和它關(guān)聯(lián)的對(duì)象。 多對(duì)多和一對(duì)多默認(rèn)采用延遲加載,一對(duì)一和多對(duì)一想實(shí)現(xiàn)延遲加載得配置lazy= true。 3 3 預(yù)先抓取預(yù)先抓取 :Hibernate 2.x版本:outer-join=true Hibernate 3.x版本:fetch=join。和立即檢索相比,預(yù)先抓取可以減少SQL語(yǔ)句的條數(shù),提高查詢速度。 4 4 批量加載批量加載 :批量加載總是和立即加載或者延遲加載聯(lián)系在一起的,分別為批量立即加載和批量延遲加載。HibernateHibernate加載策略加載策略為了提高效率,節(jié)省資源,提供了多種數(shù)據(jù)檢索策略立即加載立即加
8、載延遲加載延遲加載預(yù)先抓取預(yù)先抓取批量加載批量加載同時(shí)使用同時(shí)使用同時(shí)使用同時(shí)使用立即加載立即加載從數(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”lazy=“false”一對(duì)一、多對(duì)一默認(rèn)就是立即加載,所以只有一對(duì)多、多對(duì)多的立即加載需要在元素中指定lazy=“false”延遲加載延遲加載從數(shù)據(jù)庫(kù)取得字段值組裝好一個(gè)對(duì)象后,并不會(huì)立即取出附屬對(duì)象。這樣做通常是為了節(jié)約內(nèi)存資源因?yàn)橐粚?duì)多、多對(duì)多關(guān)系
9、如果設(shè)置為立即加載,將有可能會(huì)加載很多的附屬對(duì)象而占據(jù)大量?jī)?nèi)存,因此這種情況常設(shè)置為延遲加載多對(duì)一、一對(duì)一設(shè)置延遲加載只需在標(biāo)簽中設(shè)置lazy=“true”加載策略舉例加載策略舉例一對(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ù)先抓取join fetch實(shí)現(xiàn)多對(duì)一默認(rèn)延遲加載,通過(guò)設(shè)置lazy=”false”或fetch=”join”實(shí)現(xiàn)立即加載下面以部門加載員工(一對(duì)多)為例: 部門對(duì)員工的加載策略配置如下: false:加載部門時(shí)立即加
10、載員工加載部門時(shí)立即加載員工true:加載部門時(shí)不加載員工加載部門時(shí)不加載員工/根據(jù)部門根據(jù)部門OID查找部門查找部門public Department getDeptById(Integer oid)Session session = HibernateSessionFactory.getSession();Transaction tx = session.beginTransaction();Department dept = (Department)session.get(Depaertment.class, oid);Set emps = dept.getEmployees();/不過(guò)
11、采用何種加載方式,這里沒(méi)有錯(cuò)不過(guò)采用何種加載方式,這里沒(méi)有錯(cuò)誤誤mit();session.close();return dept;Set emps = dept.getEmployees();/如果如果lazy=“true”,這里將出錯(cuò),這里將出錯(cuò)顯示部門詳細(xì)信息顯示部門詳細(xì)信息如果部門對(duì)員工采用如果部門對(duì)員工采用的是延遲加載,那么的是延遲加載,那么這里將會(huì)出錯(cuò)這里將會(huì)出錯(cuò)lazy=”false”lazy=”false”與與fetch=fetch= “join”“join”的區(qū)別的區(qū)別 1、lazy=”false”,立即加載,一次只查一個(gè)表。產(chǎn)生語(yǔ)句過(guò)多,如果數(shù)據(jù)多的話查詢效率較低2、fet
12、ch=”join”,使用連接查詢,減少查詢次數(shù),提交查詢效率下面通過(guò)例子說(shuō)明:lazy=”false”lazy=”false”部門對(duì)員工采用lazy=”false”立即加載員工的配置及代碼: public static void main(String args) Session session = HibernateSessionFactory.getSession(); Transaction tx = session.beginTransaction(); Department dept = (Department)session.get(Department.class, 51); m
13、it(); session.close(); System.out.println(部門名稱:部門名稱:+dept.getDeptName(); Set emps = dept.getEmployees(); for (Iterator iter = emps.iterator(); iter.hasNext();) Employee emp = (Employee) iter.next(); System.out.println(員工名字:?jiǎn)T工名字:+emp.getEmpName(); lazy=”false”lazy=”false”執(zhí)行main方法,得到控制臺(tái)信息:fetch=join f
14、etch=join 部門對(duì)員工采用fetch=join預(yù)先抓取員工的配置及代碼: public static void main(String args) Session session = HibernateSessionFactory.getSession(); Transaction tx = session.beginTransaction(); Department dept = (Department)session.get(Department.class, 51); mit(); session.close(); System.out.println(部門名稱:部門名稱:+de
15、pt.getDeptName(); Set emps = dept.getEmployees(); for (Iterator iter = emps.iterator(); iter.hasNext();) Employee emp = (Employee) iter.next(); System.out.println(員工名字:?jiǎn)T工名字:+emp.getEmpName(); fetch=joinfetch=join執(zhí)行main方法,得到控制臺(tái)信息:我們可以很明顯的看出,查詢同樣的數(shù)據(jù),采用我們可以很明顯的看出,查詢同樣的數(shù)據(jù),采用fetch=“join”比用比用lazy=“false”少
16、了兩條語(yǔ)句,提高了查詢效率;當(dāng)然,數(shù)據(jù)量越多,減少的少了兩條語(yǔ)句,提高了查詢效率;當(dāng)然,數(shù)據(jù)量越多,減少的sql語(yǔ)句就越多語(yǔ)句就越多這里還得注意,如果你使用了這里還得注意,如果你使用了fetch=“join”,那么,那么HQL語(yǔ)句會(huì)忽略配置文件語(yǔ)句會(huì)忽略配置文件中的立即加載(當(dāng)部門對(duì)員工中的立即加載(當(dāng)部門對(duì)員工fetch=”join”并且使用并且使用HQL語(yǔ)句語(yǔ)句”from Department” 不會(huì)取出員工)。不會(huì)取出員工)。 inverseinverse屬性屬性inverseinverse屬性表示將關(guān)系轉(zhuǎn)由對(duì)方維護(hù)屬性表示將關(guān)系轉(zhuǎn)由對(duì)方維護(hù)session = HibernateSess
17、ionFactory.getSession(); /開(kāi)啟連接tx = session.beginTransaction(); /開(kāi)啟事務(wù)Department dept =(Department) session.get(Departemt.class,oid);dept.getEmployees.add(emp);/inverse=mit();session = HibernateSessionFactory.getSession(); /開(kāi)啟連接tx = session.beginTransaction(); /開(kāi)啟事務(wù) Department dept=(Department ) session.get
溫馨提示
- 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年中國(guó)直流穩(wěn)壓電源市場(chǎng)發(fā)展前景預(yù)測(cè)及投資戰(zhàn)略咨詢報(bào)告
- 一級(jí)公路可行性研究報(bào)告
- 2025年 云南省高級(jí)維修電工職業(yè)技能考試練習(xí)題附答案
- 2025年 四川廣安前鋒區(qū)就業(yè)保障中心招聘考試筆試試題附答案
- 2025年中國(guó)低壓電動(dòng)機(jī)保護(hù)器行業(yè)市場(chǎng)深度分析及投資策略咨詢報(bào)告
- 2025年 惠東縣安墩鎮(zhèn)招聘村“兩委”班子和村民小組長(zhǎng)儲(chǔ)備人選考試試題附答案
- 2025年工業(yè)固廢項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模板
- 2025年 甘肅工業(yè)和信息化廳廳屬事業(yè)單位地質(zhì)測(cè)繪類專業(yè)招聘考試筆試試題附答案
- 2025年 北京中水科工程集團(tuán)有限公司招聘考試筆試試題附答案
- 2025年中國(guó)電抗器行業(yè)市場(chǎng)供需現(xiàn)狀及投資前景展望報(bào)告
- 浙江開(kāi)放大學(xué)2025年《社區(qū)治理》終考測(cè)試答案
- 跟著音樂(lè)游中國(guó)智慧樹(shù)知到期末考試答案章節(jié)答案2024年廣州大學(xué)
- 人工智能智慧樹(shù)知到期末考試答案章節(jié)答案2024年復(fù)旦大學(xué)
- 激光切割機(jī)日常保養(yǎng)表
- 中醫(yī)四大經(jīng)典知識(shí)競(jìng)賽真題模擬匯編(共702題)
- 工商銀行個(gè)人客戶經(jīng)理初級(jí)考試
- 機(jī)關(guān)檔案管理工作培訓(xùn)課件
- 石材產(chǎn)品質(zhì)量保證書
- 部編版五年級(jí)語(yǔ)文下冊(cè)作文范文全套
- 衰老生物學(xué)ppt課件(PPT 57頁(yè))
- 企業(yè)部門單位工傷事故報(bào)告書
評(píng)論
0/150
提交評(píng)論