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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

下面分別進行討論:

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

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

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

4批量加載:批量加載總是和立即加載或者延遲加載聯(lián)系在一起的,分別為批量立即加載和批量延遲加載。T05加載策略Hibernate加載策略為了提高效率,節(jié)省資源,提供了多種數(shù)據(jù)檢索策略立即加載延遲加載預先抓取批量加載同時使用同時使用T05加載策略立即加載從數(shù)據(jù)庫取得字段值組裝好一個對象后,會立即從數(shù)據(jù)庫取出關聯(lián)的附屬對象,脫離Session后仍可以使用這些附屬對象立即加載的適用情況:加載對象時,馬上就要用到附屬對象的數(shù)據(jù)一對一、多對一被關聯(lián)對象是”一”這端的立即加載的配置為lazy=“false”一對一、多對一默認就是立即加載,所以只有一對多、多對多的立即加載需要在<set>元素中指定lazy=“false”T05加載策略延遲加載從數(shù)據(jù)庫取得字段值組裝好一個對象后,并不會立即取出附屬對象。這樣做通常是為了節(jié)約內存資源因為一對多、多對多關系如果設置為立即加載,將有可能會加載很多的附屬對象而占據(jù)大量內存,因此這種情況常設置為延遲加載多對一、一對一設置延遲加載只需在<set>標簽中設置lazy=“true”T05加載策略加載策略舉例一對一默認立即加載、一般不改動一對多默認延遲加載,通過設置lazy=”false”、或fetch=”join”實現(xiàn)立即加載,但一般一對多盡量設成lazy=”true”,當要實現(xiàn)立即加載時通過HQL語句的預先抓取joinfetch實現(xiàn)多對一默認延遲加載,通過設置lazy=”false”或fetch=”join”實現(xiàn)立即加載下面以部門加載員工(一對多)為例:T05加載策略部門對員工的加載策略配置如下:<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:加載部門時立即加載員工true:加載部門時不加載員工<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();//不過采用何種加載方式,這里沒有錯誤mit();session.close();returndept;Setemps=dept.getEmployees();//如果lazy=“true”,這里將出錯}T05加載策略顯示部門詳細信息如果部門對員工采用的是延遲加載,那么這里將會出錯T05加載策略lazy=”false”與fetch=

“join”的區(qū)別

1、lazy=”false”,立即加載,一次只查一個表。產生語句過多,如果數(shù)據(jù)多的話查詢效率較低2、fetch=”join”,使用連接查詢,減少查詢次數(shù),提交查詢效率下面通過例子說明:T05加載策略lazy=”false”部門對員工采用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方法,得到控制臺信息:T05加載策略fetch="join"部門對員工采用fetch="join"預先抓取員工的配置及代碼:

<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方法,得到控制臺信息:我們可以很明顯的看出,查詢同樣的數(shù)據(jù),采用fetch=“join”比用lazy=“false”少了兩條語句,提高了查詢效率;當然,數(shù)據(jù)量越多,減少的sql語句就越多這里還得注意,如果你使用了fetch=“join”,那么HQL語句會忽略配置文件中的立即加載(當部門對員工fetch=”join”并且使用HQL語句”fromDepartment”不會取出員工)。

T05加載策略inverse屬性inverse屬性表示將關系轉由對方維護 session=HibernateSessionFactory.getSession();

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論