Hibernate3.6課程文檔(二)_第1頁(yè)
Hibernate3.6課程文檔(二)_第2頁(yè)
Hibernate3.6課程文檔(二)_第3頁(yè)
Hibernate3.6課程文檔(二)_第4頁(yè)
Hibernate3.6課程文檔(二)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1. Hibernate檢索1.1. hibernate檢索方式說(shuō)明Hibernate 提供了以下幾種檢索對(duì)象的方式 導(dǎo)航對(duì)象圖檢索方式: 根據(jù)已經(jīng)加載的對(duì)象導(dǎo)航到其他對(duì)象 OID 檢索方式: 按照對(duì)象的 OID 來(lái)檢索對(duì)象 HQL 檢索方式: 使用面向?qū)ο蟮?HQL 查詢(xún)語(yǔ)言 QBC 檢索方式: 使用 QBC(Query By Criteria) API 來(lái)檢索對(duì)象. 這種 API 封裝了基于字符串形式的查詢(xún)語(yǔ)句, 提供了更加面向?qū)ο蟮牟樵?xún)接口. 本地 SQL 檢索方式: 使用本地?cái)?shù)據(jù)庫(kù)的 SQL 查詢(xún)語(yǔ)句1.2. HQL 檢索方式HQL(Hibernate Query Language)

2、是面向?qū)ο蟮牟樵?xún)語(yǔ)言, 它和 SQL 查詢(xún)語(yǔ)言有些相似. 在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式. 它有如下功能: 在查詢(xún)語(yǔ)句中設(shè)定各種查詢(xún)條件 支持投影查詢(xún), 即僅檢索出對(duì)象的部分屬性 支持分頁(yè)查詢(xún) 支持連接查詢(xún) 支持分組查詢(xún), 允許使用 HAVING 和 GROUP BY 關(guān)鍵字 提供內(nèi)置聚集函數(shù), 如 sum(), min() 和 max() 能夠調(diào)用 用戶(hù)定義的 SQL 函數(shù)或標(biāo)準(zhǔn)的 SQL 函數(shù) 支持子查詢(xún) 支持動(dòng)態(tài)綁定參數(shù)HQL檢索方式包括以下步驟: 通過(guò) Session 的 createQuery() 方法創(chuàng)建一個(gè) Query 對(duì)象, 它

3、包括一個(gè) HQL 查詢(xún)語(yǔ)句. HQL 查詢(xún)語(yǔ)句中可以包含命名參數(shù) 動(dòng)態(tài)綁定參數(shù) 調(diào)用 Query 的 list() 方法執(zhí)行查詢(xún)語(yǔ)句. 該方法返回 java.util.List 類(lèi)型的查詢(xún)結(jié)果, 在 List 集合中存放了符合查詢(xún)條件的持久化對(duì)象. Qurey 接口支持方法鏈編程風(fēng)格, 它的 setXxx() 方法返回自身實(shí)例, 而不是 void 類(lèi)型HQL vs SQL: HQL 查詢(xún)語(yǔ)句是面向?qū)ο蟮? Hibernate 負(fù)責(zé)解析 HQL 查詢(xún)語(yǔ)句, 然后根據(jù)對(duì)象-關(guān)系映射文件中的映射信息, 把 HQL 查詢(xún)語(yǔ)句翻譯成相應(yīng)的 SQL 語(yǔ)句. HQL 查詢(xún)語(yǔ)句中的主體是域模型中的類(lèi)及類(lèi)的屬性

4、 SQL 查詢(xún)語(yǔ)句是與關(guān)系數(shù)據(jù)庫(kù)綁定在一起的. SQL 查詢(xún)語(yǔ)句中的主體是數(shù)據(jù)庫(kù)表及表的字段. HQL的語(yǔ)法類(lèi)似SQL語(yǔ)法。1.2.1. 綁定參數(shù) Hibernate 的參數(shù)綁定機(jī)制依賴(lài)于 JDBC API 中的 PreparedStatement 的預(yù)定義 SQL 語(yǔ)句功能. HQL 的參數(shù)綁定由兩種形式: 按參數(shù)名字綁定: 在 HQL 查詢(xún)語(yǔ)句中定義命名參數(shù), 命名參數(shù)以 “:” 開(kāi)頭. 按參數(shù)位置綁定: 在 HQL 查詢(xún)語(yǔ)句中用 “?” 來(lái)定義參數(shù)位置 相關(guān)方法: setEntity(): 把參數(shù)與一個(gè)持久化類(lèi)綁定 setParameter(): 綁定任意類(lèi)型的參數(shù). 該方法的第三個(gè)參數(shù)

5、顯式指定 Hibernate 映射類(lèi)型綁定參數(shù)的形式,按參數(shù)名稱(chēng)綁定hql 查詢(xún):Query query = session.createQuery(from Customer c where + =:custname and c.age=:custage);/第一個(gè)參數(shù)代表名字,第二個(gè)參數(shù)代表值query.setString(custname, Tom);query.setInteger(custage, 21);List list = query.list();綁定參數(shù)的形式,按參數(shù)位置綁定Query query = session.createQuery(from Custo

6、mer c where =? and c.age=?);query.setString(0,Tom);query.setInteger(1, 21);Query.list();1.2.2. 使用別名通過(guò)HQL檢索一個(gè)類(lèi)的實(shí)例時(shí),如果查詢(xún)語(yǔ)句的其他地方需要引用它,應(yīng)該為這個(gè)類(lèi)指定一個(gè)別名from Customer as c where =:custname as 可省略1.2.3. 排序 HQL 采用 ORDER BY 關(guān)鍵字對(duì)查詢(xún)結(jié)果排序hql 查詢(xún):Query query = session.createQuery(from Customer c order by c

7、.id);QBC查詢(xún):Criteria criteria = session.createCriteria(Customer.class);criteria.addOrder(org.hibernate.criterion.Order.asc(“id);1.2.4. 分頁(yè)查詢(xún): setFirstResult(int firstResult): 設(shè)定從哪一個(gè)對(duì)象開(kāi)始檢索, 參數(shù) firstResult 表示這個(gè)對(duì)象在查詢(xún)結(jié)果中的索引位置, 索引位置的起始值為 0. 默認(rèn)情況下, Query 從查詢(xún)結(jié)果中的第一個(gè)對(duì)象開(kāi)始檢索 setMaxResult(int maxResults): 設(shè)定一次最多

8、檢索出的對(duì)象的數(shù)目. 在默認(rèn)情況下, Query 和 Criteria 接口檢索出查詢(xún)結(jié)果中所有的對(duì)象1.2.5. 投影查詢(xún) 投影查詢(xún): 查詢(xún)結(jié)果僅包含實(shí)體的部分屬性. 通過(guò) SELECT 關(guān)鍵字實(shí)現(xiàn). Query 的 list() 方法返回的集合中包含的是數(shù)組類(lèi)型的元素, 每個(gè)對(duì)象數(shù)組代表查詢(xún)結(jié)果的一條記錄 可以在持久化類(lèi)中定義一個(gè)對(duì)象的構(gòu)造器來(lái)包裝投影查詢(xún)返回的記錄, 使程序代碼能完全運(yùn)用面向?qū)ο蟮恼Z(yǔ)義來(lái)訪問(wèn)查詢(xún)結(jié)果集. 可以通過(guò) DISTINCT 關(guān)鍵字來(lái)保證查詢(xún)結(jié)果不會(huì)返回重復(fù)元素from Customer c join c.orders o where o.orderNumber l

9、ike T%如果希望查詢(xún)結(jié)果中只包含Customer對(duì)象,可使用以下形式:select c from Customer c join c.orders o where o.orderNumber like T%-Select關(guān)鍵字還能用于選擇對(duì)象的部分屬性session.createQuery(“select c.id,,o.orderNumber from Customer c join c.orders o where o.orderNumber like T%”)對(duì)應(yīng)的sql語(yǔ)句為:select c.ID,c.NAME,o.ORDER_NUMBER from CUSTOMER

10、S c inner join ORDERS o on c.ID-=o.CUSTOMER_ID where o.ORDER_NUMBER likeT%-過(guò)濾重復(fù)元素createQuery(“select distinct from customer c”);/list集合中存放的對(duì)象數(shù)組,數(shù)組中存放的查詢(xún)的部分屬性Query query = session.createQuery(select c.id,,o.orderNumber + from Customer c join c.orders o where o.orderNumber like %NO1%);Lis

11、t list = query.list(); Iterator it = list.iterator();while (it.hasNext() Object pair=(Object)it.next();Integer id=(Integer)pair0;String name=(String)pair1;String orderNumber=(String)pair2;System.out.print(id + +name+ +orderNumber);System.out.println( );使用構(gòu)造函數(shù)Query query = session.createQuery(select

12、new cn.itcast.CustomerRow(c.id,,o.orderNumber) + from Customer c join c.orders o where o.orderNumber like %NO1%);List list = query.list(); Iterator it = list.iterator();while (it.hasNext() CustomerRow cr=(CustomerRow)it.next();System.out.print(cr.getId() + +cr.getName()+ +cr.getOrderNumber();S

13、ystem.out.println( );1.2.6. 分組與聚集函數(shù)報(bào)表查詢(xún)用于對(duì)數(shù)據(jù)分組和統(tǒng)計(jì), 與 SQL 一樣, HQL 利用 GROUP BY 關(guān)鍵字對(duì)數(shù)據(jù)分組, 用 HAVING 關(guān)鍵字對(duì)分組數(shù)據(jù)設(shè)定約束條件.List list=session.createQuery(select ,count(c) from Customer c group by ).list();System.out.println(list.size();在 HQL 查詢(xún)語(yǔ)句中可以調(diào)用以下聚集函數(shù) count() min() max() sum() avg()使用聚集函數(shù)Query

14、query = session.createQuery(select count(*) from Customer c);/Integer count=(Integer)query.uniqueResult();/System.out.println(count +count); /*/Query query = session.createQuery(select avg(c.age) from Customer c);/ Float avg=(Float)query.uniqueResult();/ System.out.println(avg +avg);/*/ /Query query

15、 = session.createQuery(select max(c.age),min(c.age) from Customer c);/ Object maxmin=(Object)query.uniqueResult();/ System.out.println(max +(Long)maxmin0);/ System.out.println(min +(Long)maxmin1); /*/ /Query query = session.createQuery(select sum(c.age) from Customer c);/ Long sum=(Long)query.unique

16、Result();/ System.out.println(sum +sum);1.2.7. 在映射文件中定義命名查詢(xún)語(yǔ)句 . -query = session.getNamedQuery(“findCustomersByName”);query.setString(“name”,”Tom”);query.list();1.2.8. 其他的查詢(xún)動(dòng)態(tài)查詢(xún):session.createCriteria(Customer.class) .add(Expression.like(“name”,name.toLowerCase(),MatchMode.ANYWHERE) .add(Expression.

17、eq(“age”,new Integer(11);集合過(guò)濾:hql:createQuery(“from Order o where o.customer=:customer and o.price100 order by o.price”).setEntity(“customer”,customer).list();使用集合過(guò)濾:session.createFilter(customer.getOrders(),”where this.price 100 order by this.price”).list();子查詢(xún):from Customer c where 1 Restrictions.

18、ge大于等于=Restrictions.lt小于Restrictions.le小于等于=Restrictions.between對(duì)應(yīng)sql的between子句Restrictions.like對(duì)應(yīng)sql的like子句Restrictions.in對(duì)應(yīng)sql的in子句Restrictions.andand 關(guān)系Restrictions.oror關(guān)系Restrictions.sqlRestrictionSql限定查詢(xún)1.4. 本地 SQL 檢索方式(了解)SQLQuery sqlquery = session .createSQLQuery(select c.* from CUSTOMERS c

19、where+ like :customerName and c.age=:customerAge);/ 動(dòng)態(tài)綁定參數(shù)sqlquery.setString(customerName, “%t%);sqlquery.setLong(customerAge, 21);“c”用來(lái)引用數(shù)據(jù)表的別名,例如以上代碼中c.*表示使用c來(lái)作為customers表別名。 把sql查詢(xún)返回的關(guān)系數(shù)據(jù)映射為對(duì)象sqlquery.addEntity(c, Customer.class);/ 執(zhí)行sql select語(yǔ)句,返回查詢(xún)結(jié)果。List list = sqlquery.list();1.5. 簡(jiǎn)單的

20、查詢(xún)/使用hql查詢(xún) Query query=session.createQuery(from Customer c where = tom1 ); List list=query.list();/使用qbc查詢(xún) 主要由Criteria、Criterion接口和Restrictions類(lèi)組成,他支持在運(yùn)行時(shí)動(dòng)態(tài)生成查詢(xún)語(yǔ)句。Criteria criteria=session.createCriteria(Customer.class); /設(shè)定查詢(xún)條件,每個(gè)Criterion實(shí)例代表一個(gè)查詢(xún)條件Criterion cn1=Restrictions.eq(name, tom1);c

21、riteria.add(cn1);list=criteria.list();/方法鏈編程:session.createCriteria(Customer.class) .add(Restrictions.eq(name, tom1) .list();1.6. HQL和QBC支持的各種運(yùn)算運(yùn)算類(lèi)型HQL運(yùn)算符QBC運(yùn)算方法比較運(yùn)算=Restrictions.eq()Restrictions.not(Restrictions.eq()=Restrictions.ge()Restrictions.lt()=Restrictions.le()is nullRestrictions.isNull()is

22、 not nullRestrictions.isNotNull()范圍運(yùn)算符inRestrictions.in()not inRestrictions.not(Restrictions.in()betweenRestrictions.between()not betweenRestrictions.not(Restrictions.between()字符串模式匹配likeRestrictionsion.like()邏輯andRestrictionsion.and()|Restrictionsion.conjunction()orRestrictionsion.or()|Restrictions

23、ion.disjunction()notRestrictionsion.not()1.6.1. 小結(jié)比較方面HQL檢索QBC檢索可讀性?xún)?yōu)點(diǎn):和sql相近,易讀將語(yǔ)句肢解成一組criteria,較差功能支持各種查詢(xún)不支持報(bào)表查詢(xún)和子查詢(xún)。有限的連接查詢(xún)查詢(xún)語(yǔ)句形式基于字符串形式的sql更加面向?qū)ο蠛螘r(shí)被解析運(yùn)行時(shí)被解析編譯時(shí)被解析,更易排錯(cuò)可擴(kuò)展性不具擴(kuò)展性用戶(hù)可擴(kuò)展criteria接口對(duì)動(dòng)態(tài)查詢(xún)語(yǔ)句的支持支持動(dòng)態(tài)查詢(xún),編程麻煩適合動(dòng)態(tài)生成查詢(xún)語(yǔ)句2. 事務(wù)事務(wù)的概念事務(wù)可以看作是由對(duì)數(shù)據(jù)庫(kù)的若干操作組成的一個(gè)單元,這些操作要么都完成,要么都取消,從而保證數(shù)據(jù)滿(mǎn)足一致性的要求。事務(wù)的一個(gè)典型例子

24、是銀 行中的轉(zhuǎn)帳操作,帳戶(hù)A把一定數(shù)量的款項(xiàng)轉(zhuǎn)到帳戶(hù)B上,這個(gè)操作包括兩個(gè)步驟,一個(gè)是從帳戶(hù)A上把存款減去一定數(shù)量,二是在帳戶(hù)B上把存款加上相同的數(shù) 量。這兩個(gè)步驟顯然要么都完成,要么都取消,否則銀行就會(huì)受損失。顯然,這個(gè)轉(zhuǎn)帳操作中的兩個(gè)步驟就構(gòu)成一個(gè)事務(wù)。數(shù)據(jù)庫(kù)中的事務(wù)還有如下ACID特征。ACID分別是四個(gè)英文單詞的首寫(xiě)字母,這四個(gè)英文單詞是Atomicity、Consistency、Isolation、Durability,分別翻譯為原子性、一致性、隔離性、持久性。原子性:指事務(wù)中的操作,或者都完成,或者都取消。一致性:指事務(wù)中的操作保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)不會(huì)出現(xiàn)邏輯上不一致的情況,一致性一

25、般會(huì)隱含的包括在其他屬性之中。隔離性:指當(dāng)前的事務(wù)與其他未完成的事務(wù)是隔離的。在不同的隔離級(jí)別下,事務(wù)的讀取操作,可以得到的結(jié)果是不同的。持久性:指對(duì)事務(wù)發(fā)出COMMIT命令后,即使這時(shí)發(fā)生系統(tǒng)故障,事務(wù)的效果也被持久化了。與此相反的是,當(dāng)在事務(wù)執(zhí)行過(guò)程中,系統(tǒng)發(fā)生故障,則事務(wù)的操作都被回滾,即數(shù)據(jù)庫(kù)回到事務(wù)開(kāi)始之前的狀態(tài)。對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)修改都是在內(nèi)存中完成的,這些修改的結(jié)果可能已經(jīng)寫(xiě)到硬盤(pán)也可能沒(méi)有寫(xiě)到硬盤(pán),如果在操作過(guò)程中,發(fā)生斷電或系統(tǒng)錯(cuò)誤等故障, 數(shù)據(jù)庫(kù)可以保證未結(jié)束的事務(wù)對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)修改結(jié)果即使已經(jīng)寫(xiě)入磁盤(pán),在下次數(shù)據(jù)庫(kù)啟動(dòng)后也會(huì)被全部撤銷(xiāo);而對(duì)于結(jié)束的事務(wù),即使其修改的結(jié)果還未

26、寫(xiě)入磁 盤(pán),在數(shù)據(jù)庫(kù)下次啟動(dòng)后會(huì)通過(guò)事務(wù)日志中的記錄進(jìn)行“重做”,即把丟失的數(shù)據(jù)修改結(jié)果重新生成,并寫(xiě)入磁盤(pán),從而保證結(jié)束事務(wù)對(duì)數(shù)據(jù)修改的永久化。這樣也 保證了事務(wù)中的操作要么全部完成,要么全部撤銷(xiāo)。和并發(fā)2.1. 數(shù)據(jù)庫(kù)的隔離級(jí)別在SQL92標(biāo)準(zhǔn)中,事務(wù)隔離級(jí)別分為四種,分別為:Read Uncommitted、Read Committed、Read Repeatable、Serializable,其中Read Uncommitted與Read Committed為語(yǔ)句級(jí)別的,而Read Repeatable與Serializable是針對(duì)事務(wù)級(jí)別的。在Oracle和SQL Server中設(shè)

27、置事務(wù)隔離級(jí)別的語(yǔ)句是相同的,都使用SQL92標(biāo)準(zhǔn)語(yǔ)法,即:Set Transaction Isolation Level Read Committed上面示例中的Read Committed可以被替換為其他三種隔離級(jí)別中的任意一種。在SQL Server中提供了所有這四種隔離級(jí)別。Read Uncommitted:一個(gè)會(huì)話可以讀取其他事務(wù)未提交的更新結(jié)果,如果這個(gè)事務(wù)最后以回滾結(jié)束,這時(shí)的讀取結(jié)果就可能是錯(cuò)誤的,所以多數(shù)的數(shù)據(jù)庫(kù)應(yīng)用都不會(huì)使用這種隔離級(jí)別。Read Committed:這是SQL Server的缺省隔離級(jí)別,設(shè)置為這種隔離級(jí)別的事務(wù)只能讀取其他事務(wù)已經(jīng)提交的更新結(jié)果,否則,發(fā)

28、生等待,但是其他會(huì)話可以修改這個(gè)事務(wù)中被讀取的記 錄,而不必等待事務(wù)結(jié)束,顯然,在這種隔離級(jí)別下,一個(gè)事務(wù)中的兩個(gè)相同的讀取操作,其結(jié)果可能不同。Read Repeatable:在一個(gè)事務(wù)中,如果在兩次相同條件的讀取操作之間沒(méi)有添加記錄的操作,也沒(méi)有其他更新操作導(dǎo)致在這個(gè)查詢(xún)條件下記錄數(shù)增多,則兩次 讀取結(jié)果相同。換句話說(shuō),就是在一個(gè)事務(wù)中第一次讀取的記錄保證不會(huì)在這個(gè)事務(wù)期間發(fā)生改變。SQL Server是通過(guò)在整個(gè)事務(wù)期間給讀取的記錄加鎖實(shí)現(xiàn)這種隔離級(jí)別的,這樣,在這個(gè)事務(wù)結(jié)束前,其他會(huì)話不能修改事務(wù)中讀取的記錄,而只能等待事務(wù)結(jié) 束,但是SQL Server不會(huì)阻礙其他會(huì)話向表中添加記錄

29、,也不阻礙其他會(huì)話修改其他記錄。Serializable:在一個(gè)事務(wù)中,讀取操作的結(jié)果是在這個(gè)事務(wù)開(kāi)始之前其他事務(wù)就已經(jīng)提交的記錄,SQL Server通過(guò)在整個(gè)事務(wù)期間給表加鎖實(shí)現(xiàn)這種隔離級(jí)別。在這種隔離級(jí)別下,對(duì)這個(gè)表的所有DML操作都是不允許的,即要等待事務(wù)結(jié)束,這樣就保證了在 一個(gè)事務(wù)中的兩次讀取操作的結(jié)果肯定是相同的。 對(duì)于同時(shí)運(yùn)行的多個(gè)事務(wù), 當(dāng)這些事務(wù)訪問(wèn)數(shù)據(jù)庫(kù)中相同的數(shù)據(jù)時(shí), 如果沒(méi)有采取必要的隔離機(jī)制, 就會(huì)導(dǎo)致各種并發(fā)問(wèn)題: 臟讀: 對(duì)于兩個(gè)事物 T1, T2, T1 讀取了已經(jīng)被 T2 更新但還沒(méi)有被提交的字段. 之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時(shí)且無(wú)效的.

30、 不可重復(fù)讀: 對(duì)于兩個(gè)事物 T1, T2, T1 讀取了一個(gè)字段, 然后 T2 更新了該字段. 之后, T1再次讀取同一個(gè)字段, 值就不同了. 幻讀: 對(duì)于兩個(gè)事物 T1, T2, T1 從一個(gè)表中讀取了一個(gè)字段, 然后 T2 在該表中插入了一些新的行. 之后, 如果 T1 再次讀取同一個(gè)表, 就會(huì)多出幾行. 數(shù)據(jù)庫(kù)事務(wù)的隔離性: 數(shù)據(jù)庫(kù)系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個(gè)事務(wù)的能力, 使它們不會(huì)相互影響, 避免各種并發(fā)問(wèn)題. 一個(gè)事務(wù)與其他事務(wù)隔離的程度稱(chēng)為隔離級(jí)別. 數(shù)據(jù)庫(kù)規(guī)定了多種事務(wù)隔離級(jí)別, 不同隔離級(jí)別對(duì)應(yīng)不同的干擾程度, 隔離級(jí)別越高, 數(shù)據(jù)一致性就越好, 但并發(fā)性越弱SQL ANSI

31、 SQL 標(biāo)準(zhǔn)定義了 4 種事務(wù)隔離級(jí)別,級(jí)別越高,成本越高:注: Oracle 只支持 2 種事務(wù)隔離級(jí)別:READ COMMITED, SERIALIZABLE. Oracle 默認(rèn)的事務(wù)隔離級(jí)別為: READ COMMITED Mysql 支持4中事務(wù)隔離級(jí)別。Mysql 默認(rèn)的事務(wù)隔離級(jí)別為: REPEATABLE READ2.2. 在 MySql 中設(shè)置隔離級(jí)別 每啟動(dòng)一個(gè) mysql 程序, 就會(huì)獲得一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)連接. 每個(gè)數(shù)據(jù)庫(kù)連接都有一個(gè)全局變量 tx_isolation, 表示當(dāng)前的事務(wù)隔離級(jí)別. MySQL 默認(rèn)的隔離級(jí)別為 Repeatable Read 查看當(dāng)前的隔

32、離級(jí)別: 當(dāng)前連接:SELECT tx_isolation; 全局:SELECT global.tx_isolation; 設(shè)置當(dāng)前 mySQL 連接的隔離級(jí)別: set transaction isolation level read committed; 或set session transaction isolation level read uncommitted; 設(shè)置數(shù)據(jù)庫(kù)系統(tǒng)的全局的隔離級(jí)別: set global transaction isolation level read committed;2.3. 在 Hibernate 中設(shè)置隔離級(jí)別JDBC 數(shù)據(jù)庫(kù)連接使用數(shù)據(jù)庫(kù)系

33、統(tǒng)默認(rèn)的隔離級(jí)別. 在 Hibernate 的配置文件中可以顯式的設(shè)置隔離級(jí)別. 每一個(gè)隔離級(jí)別都對(duì)應(yīng)一個(gè)整數(shù):隔離級(jí)別對(duì)應(yīng)的整數(shù)表示READ UNCOMMITED1READ COMMITED2REPEATABLE READ4SERIALIZEABLE8Hibernate 通過(guò)為 Hibernate 映射文件指定 hibernate.connection.isolation 屬性來(lái)設(shè)置事務(wù)的隔離級(jí)別。例:hibernate.connection.isolation = 4注意 Hibernate不可能改變?cè)谑芄墉h(huán)境下由應(yīng)用服務(wù)器提供的數(shù)據(jù)庫(kù)連接的隔離級(jí)別,只能通過(guò)改變應(yīng)用服務(wù)器配置的方式來(lái)改變

34、. 設(shè)置隔離級(jí)別是全局選項(xiàng),會(huì)影響所有的連接和事務(wù)2.4. 管理session(CurrentSessionContext)2.4.1. 關(guān)于管理Session 盡管讓程序自主管理 Session 對(duì)象的生命周期也是可行的, 但是在實(shí)際 Java 應(yīng)用中, 把管理 Session 對(duì)象的生命周期交給 Hibernate 管理, 可以簡(jiǎn)化 Java 應(yīng)用程序代碼和軟件架構(gòu) Hibernate 3 自身提供了三種管理 Session 對(duì)象的方法 Session 對(duì)象的生命周期與本地線程綁定 Session 對(duì)象的生命周期與 JTA 事務(wù)綁定 Hibernate 委托程序管理 Session 對(duì)象的

35、生命周期 在 Hibernate 的配置文件中, hibernate.current_session_context_class 屬性用于指定 Session 管理方式, 可選值包括 thread: Session 對(duì)象的生命周期與本地線程綁定 jta*: Session 對(duì)象的生命周期與 JTA 事務(wù)綁定 managed: Hibernate 委托程序來(lái)管理 Session 對(duì)象的生命周期2.4.2. Session 對(duì)象的生命周期與本地線程綁定(通過(guò)Thread-local傳播Session,線程本地化) 如果把 Hibernate 配置文件的 hibernate.current_sess

36、ion_context_class 屬性值設(shè)為 thread, Hibernate 就會(huì)按照與本地線程綁定的方式來(lái)管理 Session Hibernate 按以下規(guī)則把 Session 與本地線程綁定 當(dāng)一個(gè)線程(threadA)第一次調(diào)用 SessionFactory 對(duì)象的 getCurrentSession() 方法時(shí), 該方法會(huì)創(chuàng)建一個(gè)新的 Session(sessionA) 對(duì)象, 把該對(duì)象與 threadA 綁定, 并將 sessionA 返回 當(dāng) threadA 再次調(diào)用 SessionFactory 對(duì)象的 getCurrentSession() 方法時(shí), 該方法將返回 ses

37、sionA 對(duì)象 當(dāng) threadA 提交 sessionA 對(duì)象關(guān)聯(lián)的事務(wù)時(shí), Hibernate 會(huì)自動(dòng)清理 sessionA 對(duì)象的緩存, 然后提交事務(wù), 關(guān)閉 sessionA 對(duì)象. 當(dāng) threadA 撤銷(xiāo) sessionA 對(duì)象關(guān)聯(lián)的事務(wù)時(shí), 也會(huì)自動(dòng)關(guān)閉 sessionA 對(duì)象 若 threadA 再次調(diào)用 SessionFactory 對(duì)象的 getCurrentSession() 方法時(shí), 該方法會(huì)又創(chuàng)建一個(gè)新的 Session(sessionB) 對(duì)象, 把該對(duì)象與 threadA 綁定, 并將 sessionB 返回 配置: 在hibernate.cfg.xml文件中增

38、加 thread 不是調(diào)用sessionFactory.openSession().而是調(diào)用sessionFactory. getCurrentSession().獲取session對(duì)象.從當(dāng)前的線程提取session: 當(dāng)前線程如果存在session對(duì)象,取出直接使用 當(dāng)前線程如果不存在session對(duì)象,獲取一個(gè)新的session對(duì)象和當(dāng)前的線程綁定測(cè)試代碼:3. 提升性能3.1. 使用連接池配置c3p0連接池* 引入c3p0-0.9.1.jar* 在hibernate.cfg.xml文件中增加如下配置org.hibernate.connection.C3P0ConnectionProvi

39、der 520120 30003.2. Hibernate的檢索策略3.2.1. hibernate的檢索策略簡(jiǎn)介檢索策略的作用域可選的檢索策略默認(rèn)的檢索策略運(yùn)行時(shí)行為受影響的session的檢索方法類(lèi)級(jí)別立即延遲延遲load關(guān)聯(lián)級(jí)別立即延遲迫切左外連接檢索延遲loadget類(lèi)級(jí)別和關(guān)聯(lián)級(jí)別可選的檢索策略及默認(rèn)的檢索策略3.2.2. 區(qū)分立即檢索和延遲檢索Class 標(biāo)簽中l(wèi)azy=false 立即檢索public void loadCustomerFalse()Session session=sessionFacoty.openSession();Transaction tx=session

40、.beginTransaction(); /該行代碼讓hibernate執(zhí)行select語(yǔ)句,查詢(xún)數(shù)據(jù)庫(kù)Customer c=(Customer)session.load(Customer.class, 1);c.getAge();mit();session.close(); class 標(biāo)簽中l(wèi)azy=true 延遲檢索public void loadCustomerTrue() Session session=sessionFacoty.openSession(); Transaction tx=session.beginTransaction(); Customer c=(C

41、ustomer)session.load(Customer.class, 1); /該行代碼讓hibernate執(zhí)行select語(yǔ)句, /查詢(xún)數(shù)據(jù)庫(kù)(需要用的時(shí)候查數(shù)據(jù)庫(kù)) c.getAge(); mit(); session.close(); 3.2.3. 理解延遲檢索中的代理public void loadCustomertrueProxy()Session session=sessionFacoty.openSession();Transaction tx=session.beginTransaction(); /此時(shí)查詢(xún)到的c對(duì)象是一個(gè)代理對(duì)象Customer c=(Cus

42、tomer)session.load(Customer.class, 1);System.out.println(c.getClass().getName(); /代理對(duì)象c.getClass(); /hibernate不會(huì)執(zhí)行select語(yǔ)句c.getId(); /hibernate不會(huì)執(zhí)行select語(yǔ)句c.getAge(); /該行hibernate會(huì)執(zhí)行select語(yǔ)句mit();session.close(); 只有延遲檢索會(huì)產(chǎn)生代理對(duì)象,立即檢索不會(huì)產(chǎn)生代理對(duì)象代理對(duì)象的類(lèi)名如下所示:Hibernate使用javassist-3.9.0.GA.jar包創(chuàng)建代理。Cust

43、omer對(duì)象代理對(duì)象(初始化oid的值,其他的值不初始化)3.2.4. 初始化延遲檢索中的代理/初始化代理對(duì)象public void loadCustomertrueProxyInit()Session session=sessionFacoty.openSession();Transaction tx=session.beginTransaction(); /此時(shí)查詢(xún)到的c對(duì)象是一個(gè)代理對(duì)象Customer c=(Customer)session.load(Customer.class, 1);System.out.println(c.getClass(); /代理對(duì)象/判斷代理對(duì)象是否被初

44、始化 對(duì)集合對(duì)象也適用if(!Hibernate.isInitialized(c) System.out.println(c.getClass(); /代理對(duì)象 System.out.println(沒(méi)有被初始化); /初始化代理對(duì)象 hibernate執(zhí)行select查詢(xún) Hibernate.initialize(c);mit();session.close(); 3.2.5. 區(qū)分類(lèi)級(jí)別和關(guān)聯(lián)級(jí)別的檢索 類(lèi)級(jí)別的檢索: Customer c=(Customer)session.load(Customer.class, 1); session的方法直接檢索Customer對(duì)象,對(duì)

45、Customer對(duì)象到底采用立即檢索 還是延遲檢索方式,是通過(guò)class元素的lazy屬性設(shè)定的關(guān)聯(lián)級(jí)別的檢索: Customer c=(Customer)session.load(Customer.class, 1); Set set=c.getOrders()/檢索Order對(duì)象的set集合 在這個(gè)例子中 session.load(Customer.class, 1):查詢(xún)的主體表 c.getOrders():查詢(xún)客體表 查詢(xún)客體表是否發(fā)生,以何種方式發(fā)生(立即檢索、延遲檢索和迫切左外連接檢索),就是關(guān)聯(lián)級(jí)別檢索 通過(guò)set元素lazy屬性設(shè)定. 類(lèi)級(jí)別檢索策略 類(lèi)級(jí)別可選的檢索策略包括立即檢索和延遲檢索, 默認(rèn)為延遲檢索 類(lèi)級(jí)別的檢索策略可以通過(guò) 元素的 lazy 屬性進(jìn)行設(shè)置 如果程序加載一個(gè)對(duì)象的目的是為了訪問(wèn)它的屬性, 可以采取立即檢索. 如果程序加載一個(gè)持久化對(duì)象的目的是僅僅為了獲得它的引用, 可以采用延遲檢索 無(wú)論 元素的 lazy 屬性是 true 還是 false, Session 的 get() 方法及 Query 的 list() 方法在類(lèi)級(jí)別總是使用立即檢索策略 若 元素的 lazy 屬性為 true 或取默認(rèn)值, Session 的 load() 方法不會(huì)執(zhí)行查詢(xún)數(shù)據(jù)表的 SELECT 語(yǔ)句, 僅返回代理類(lèi)對(duì)象的實(shí)例,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論