




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
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è)攜帶信息的載體沒與沒與sessionsession實(shí)例關(guān)聯(lián),實(shí)例關(guān)聯(lián),沒與數(shù)據(jù)庫中記錄關(guān)聯(lián)沒與數(shù)據(jù)庫中記錄關(guān)聯(lián)持久狀態(tài)持久實(shí)例在數(shù)據(jù)庫中持久實(shí)例在數(shù)據(jù)庫中有對(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()?舉例說明對(duì)象狀態(tài)舉例說明對(duì)象狀態(tài)Session session = sessionFactory.openSession(); /開啟連接開啟連接tx
3、= session.beginTransaction(); /開啟事務(wù)開啟事務(wù)Employee emp = session.get(Employee.class, 123); /根據(jù)主鍵加載根據(jù)主鍵加載emp.setEmpName(“QQ”);/對(duì)持久對(duì)象進(jìn)行更改,不需要更新對(duì)持久對(duì)象進(jìn)行更改,不需要更新session.update(emp);/更新,此句沒有必要更新,此句沒有必要mit();session.close();emp.setEmpName(“QQ1”); /對(duì)脫管對(duì)象進(jìn)行更改對(duì)脫管對(duì)象進(jìn)行更改Session session2 = sessionFactory.openSessio
4、n(); /開啟連接開啟連接tx = session2.beginTransaction(); /開啟事務(wù)開啟事務(wù)session2.update(emp);.pubic class EmpDAOpublic static Employee getEmployeeById(Integer id) Session session = sessionFactory.openSession(); /開啟連接開啟連接tx = session.beginTransaction(); /開啟事務(wù)開啟事務(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ù)庫中數(shù)據(jù)庫中empName值是什么?值是什么?加載策略介紹加載策略介紹我們知道,Hiberante是一個(gè)ORM工具,它使得我們能夠直接去操縱對(duì)象而不是數(shù)據(jù)庫中表。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ù)庫中取得字段值組裝好一個(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語句的條數(shù),提高查詢速度。 4 4 批量加載批量加載 :批量加載總是和立即加載或者延遲加載聯(lián)系在一起的,分別為批量立即加載和批量延遲加載。HibernateHibernate加載策略加載策略為了提高效率,節(jié)省資源,提供了多種數(shù)據(jù)檢索策略立即加載立即加
8、載延遲加載延遲加載預(yù)先抓取預(yù)先抓取批量加載批量加載同時(shí)使用同時(shí)使用同時(shí)使用同時(shí)使用立即加載立即加載從數(shù)據(jù)庫取得字段值組裝好一個(gè)對(duì)象后,會(huì)立即從數(shù)據(jù)庫取出關(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ù)庫取得字段值組裝好一個(gè)對(duì)象后,并不會(huì)立即取出附屬對(duì)象。這樣做通常是為了節(jié)約內(nèi)存資源因?yàn)橐粚?duì)多、多對(duì)多關(guān)系
9、如果設(shè)置為立即加載,將有可能會(huì)加載很多的附屬對(duì)象而占據(jù)大量內(nèi)存,因此這種情況常設(shè)置為延遲加載多對(duì)一、一對(duì)一設(shè)置延遲加載只需在標(biāo)簽中設(shè)置lazy=“true”加載策略舉例加載策略舉例一對(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ù)先抓取join fetch實(shí)現(xiàn)多對(duì)一默認(rèn)延遲加載,通過設(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();/不過
11、采用何種加載方式,這里沒有錯(cuò)不過采用何種加載方式,這里沒有錯(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)生語句過多,如果數(shù)據(jù)多的話查詢效率較低2、fet
12、ch=”join”,使用連接查詢,減少查詢次數(shù),提交查詢效率下面通過例子說明: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(員工名字:員工名字:+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(員工名字:員工名字:+emp.getEmpName(); fetch=joinfetch=join執(zhí)行main方法,得到控制臺(tái)信息:我們可以很明顯的看出,查詢同樣的數(shù)據(jù),采用我們可以很明顯的看出,查詢同樣的數(shù)據(jù),采用fetch=“join”比用比用lazy=“false”少
16、了兩條語句,提高了查詢效率;當(dāng)然,數(shù)據(jù)量越多,減少的少了兩條語句,提高了查詢效率;當(dāng)然,數(shù)據(jù)量越多,減少的sql語句就越多語句就越多這里還得注意,如果你使用了這里還得注意,如果你使用了fetch=“join”,那么,那么HQL語句會(huì)忽略配置文件語句會(huì)忽略配置文件中的立即加載(當(dāng)部門對(duì)員工中的立即加載(當(dāng)部門對(duì)員工fetch=”join”并且使用并且使用HQL語句語句”from Department” 不會(huì)取出員工)。不會(huì)取出員工)。 inverseinverse屬性屬性inverseinverse屬性表示將關(guān)系轉(zhuǎn)由對(duì)方維護(hù)屬性表示將關(guān)系轉(zhuǎn)由對(duì)方維護(hù)session = HibernateSess
17、ionFactory.getSession(); /開啟連接tx = session.beginTransaction(); /開啟事務(wù)Department dept =(Department) session.get(Departemt.class,oid);dept.getEmployees.add(emp);/inverse=mit();session = HibernateSessionFactory.getSession(); /開啟連接tx = session.beginTransaction(); /開啟事務(wù) Department dept=(Department ) session.get
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路開挖合同范本
- 買衣服購銷合同范本
- 養(yǎng)殖配件小窗采購合同范本
- 京津冀外包合同范本
- 農(nóng)民承包樹苗合同范本
- 企業(yè)定制酒合同范本
- 出售農(nóng)機(jī)全套紙合同范本
- 半日制合同范本
- 單位門衛(wèi)聘用合同范本
- 北京正規(guī)購車合同范本
- 2024年07月山東省泰山財(cái)產(chǎn)保險(xiǎn)股份有限公司2024年夏季校園招考29名工作人員筆試歷年參考題庫附帶答案詳解
- 品質(zhì)巡檢培訓(xùn)課件
- 醫(yī)療器械生產(chǎn)企業(yè)并購合同
- 2025版新能源汽車充電站建設(shè)合同含政府補(bǔ)貼及稅收優(yōu)惠條款
- 初驗(yàn)整改報(bào)告格式范文
- 2025年北京國資公司招聘筆試參考題庫含答案解析
- 2023青島版數(shù)學(xué)三年級(jí)下冊(cè)全冊(cè)教案
- 建設(shè)工程總承包EPC建設(shè)工程項(xiàng)目管理方案1
- T-CSUS 69-2024 智慧水務(wù)技術(shù)標(biāo)準(zhǔn)
- (2024)竹產(chǎn)業(yè)生產(chǎn)建設(shè)項(xiàng)目可行性研究報(bào)告(一)
- 《零起點(diǎn)學(xué)中醫(yī)》課件
評(píng)論
0/150
提交評(píng)論