常見(jiàn)面試題匯總_第1頁(yè)
常見(jiàn)面試題匯總_第2頁(yè)
常見(jiàn)面試題匯總_第3頁(yè)
常見(jiàn)面試題匯總_第4頁(yè)
常見(jiàn)面試題匯總_第5頁(yè)
已閱讀5頁(yè),還剩7頁(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、一.   Hibernate工作使用步驟? 1.         讀取并解析配置文件 2.         讀取并解析映射信息,創(chuàng)建SessionFactory 3.         打開(kāi)Sesssion 4.         創(chuàng)建事務(wù)Transation 5

2、.         持久化操作 6.         提交事務(wù) 7.         關(guān)閉Session 8.         關(guān)閉SesstionFactory 二Hibernate的查詢(xún)方式有幾種?(1)導(dǎo)航對(duì)象圖檢索方式。根據(jù)已經(jīng)加載的對(duì)象,導(dǎo)航到其他對(duì)象。(2)OID查詢(xún)

3、方式。根據(jù)對(duì)象的OID來(lái)查詢(xún)對(duì)象。Session的get()和load()方法。(3)HQL查詢(xún)方式。HQL是面向?qū)ο蟮牟樵?xún)語(yǔ)言,session的find()方法用于執(zhí)行HQL查詢(xún)語(yǔ)句??梢岳肣uery接口。Query query = session.createQuery(“from Customer as c where =: customerName”);query.setString(“customerName”,”張三”);List resultList = query.list();(4)QBC查詢(xún)方式。這種API封裝了基于字符串形式的查詢(xún)語(yǔ)句。Criteria c

4、riteria = session.createCriteria(User.class);Criterion criterion1 = Expession.like(“name”,”T%”);Criterion criterion2 = Expession.eq(age,new Integer(30);criteria = criteria.add(criterion1);criteria = criteria.add(criterion2);List resultList = criteria.list();這種查詢(xún)方式使用的較少,主要是在查詢(xún)中需要用戶(hù)輸入一系列的查詢(xún)條件,如果采用HQL查

5、詢(xún)代碼會(huì)比較煩。(5)本地SQL查詢(xún)?nèi)鼿ibernate的檢索策略有幾種?檢索策略的作用域可選的檢索策略默認(rèn)的運(yùn)行時(shí)受影響的session的檢索方法類(lèi)級(jí)別立即和延遲立即影響load()方法關(guān)聯(lián)級(jí)別立即,延遲,迫切左外連接多對(duì)一和一對(duì)一關(guān)聯(lián)為外連接影響load(),get(),find()方法一對(duì)多和多對(duì)多為立即檢索立即檢索-立即加載檢索方法指定的對(duì)象。延遲檢索-延遲加載檢索方法指定的對(duì)象,只有當(dāng)初次獲取其屬性或調(diào)用其方法時(shí)才加載。如果將<class>元素的lazy熟悉設(shè)置為true,那么Load()方法是延遲加載。而不管lazy是true或false,get()和find()方法永

6、遠(yuǎn)是立即檢索。session.load()和session.get()的區(qū)別Session.load/get方法均可以根據(jù)指定的實(shí)體類(lèi)和id從數(shù)據(jù)庫(kù)讀取記錄,并返回與之對(duì)應(yīng)的實(shí)體對(duì)象。其區(qū)別在于:如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會(huì)拋出一個(gè)ObjectNotFoundException。執(zhí)行l(wèi)oad方法并不會(huì)真正去查詢(xún)DB,只有當(dāng)首次訪(fǎng)問(wèn)實(shí)體對(duì)象屬性時(shí)才會(huì)去DB中真正查詢(xún)。(即懶加載)Load方法返回實(shí)體的代理類(lèi)實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類(lèi)。load支持延遲加載,get不支持延遲加載。load方法可以充分利用內(nèi)部緩存和二級(jí)緩存中的現(xiàn)有數(shù)據(jù),而get方法則

7、僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找,如沒(méi)有發(fā)現(xiàn)對(duì)應(yīng)數(shù)據(jù),將越過(guò)二級(jí)緩存,直接調(diào)用SQL完成數(shù)據(jù)讀取。四Hibernate的緩存Hibernate有2級(jí)緩存。第一級(jí)緩存是session緩存,其是事務(wù)范圍內(nèi)的緩存,第一級(jí)緩存也是必需要的,無(wú)法清除。在第一級(jí)緩存中,每個(gè)持久化的實(shí)例對(duì)象都有一個(gè)OID.第二級(jí)緩存是SessionFactory的外置緩存,是一個(gè)可以插拔的緩存插件,由SessionFactory負(fù)責(zé)管理。第二級(jí)緩存是進(jìn)程范圍內(nèi)的或者群集范圍內(nèi)的緩存。五Hibernate中對(duì)象的狀態(tài)有幾種?3種狀態(tài),瞬時(shí)狀態(tài),持久化狀態(tài),游離狀態(tài)。(1) 瞬時(shí)狀態(tài)-剛用new語(yǔ)句創(chuàng)建,尚未持久化,沒(méi)有被sess

8、ion所關(guān)聯(lián),DB中也沒(méi)有對(duì)象的記錄。(2) 持久化狀態(tài)-跟session關(guān)聯(lián),跟數(shù)據(jù)庫(kù)中的相關(guān)記錄對(duì)應(yīng)。(3) 游離狀態(tài)-由持久化對(duì)象轉(zhuǎn)變而來(lái),不再和session關(guān)聯(lián),數(shù)據(jù)庫(kù)中有可能存在與之對(duì)應(yīng)的記錄。六Hibernate中關(guān)于繼承關(guān)系的映射方式(1)每個(gè)類(lèi)分層結(jié)構(gòu)一張表優(yōu)點(diǎn):簡(jiǎn)單,只需要一張表,查詢(xún)效率高。缺點(diǎn):需要在表中引入額外區(qū)分各個(gè)子類(lèi)的字段,不能為所有的子類(lèi)成員屬性對(duì)應(yīng)的字段定義Not null約束。適用范圍:查詢(xún)性能要求高,子類(lèi)屬性不是很多時(shí)。(2)每個(gè)子類(lèi)一張表,每張表中僅僅包含在當(dāng)前類(lèi)中定義的屬性,不包含父類(lèi)或子類(lèi)的成員屬性。優(yōu)點(diǎn):支持多態(tài)查詢(xún)和關(guān)聯(lián)查詢(xún),符合關(guān)系數(shù)據(jù)模型的

9、設(shè)計(jì)規(guī)則。缺點(diǎn):查詢(xún)效率不是很高,需要通過(guò)表的內(nèi)連接或左外連接進(jìn)行查詢(xún)。適用范圍:子類(lèi)屬性非常多,需要對(duì)子類(lèi)某些屬性對(duì)應(yīng)的字段加Not null約束,且對(duì)性能要求不是很高時(shí)。(3)每個(gè)具體類(lèi)一張表,每張表中包含在當(dāng)前類(lèi)及其父類(lèi)中的所有成員屬性對(duì)應(yīng)的字段。優(yōu)點(diǎn):可以對(duì)子類(lèi)的成員屬性定義Not null約束。缺點(diǎn):不符合關(guān)系數(shù)據(jù)模型的設(shè)計(jì)規(guī)則,而且每個(gè)表中都存在基類(lèi)的多余字段。適用范圍:一般不使用。七數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別數(shù)據(jù)庫(kù)系統(tǒng)提供了四種事務(wù)隔離級(jí)別供用戶(hù)選擇。不同的隔離級(jí)別采用不同的鎖類(lèi)型來(lái)實(shí)現(xiàn),在四種隔離級(jí)別中,Serializable的隔離級(jí)別最高,Read Uncommited的隔離級(jí)別最

10、低。大多數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別為Read Commited,如SqlServer,當(dāng)然也有少部分?jǐn)?shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別為Repeatable Read ,如Mysqll Read Uncommited:讀未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀,不可重復(fù)讀和幻讀)。l Read Commited:讀已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)l Repeatable Read:可重復(fù)讀(會(huì)出現(xiàn)幻讀)l Serializable:串行化八Hibernate的懶加載原理。所謂懶加載(lazy)就是延時(shí)加載,延遲加載。 什么時(shí)候用懶加載呢,我只能回答要用懶加載的時(shí)候就用懶加載。 至于為什么要用懶加載呢,就是當(dāng)我們要訪(fǎng)問(wèn)的數(shù)據(jù)量過(guò)

11、大時(shí),明顯用緩存不太合適, 因?yàn)閮?nèi)存容量有限 ,為了減少并發(fā)量,減少系統(tǒng)資源的消耗, 我們讓數(shù)據(jù)在需要的時(shí)候才進(jìn)行加載,這時(shí)我們就用到了懶加載。延遲加載機(jī)制是為了避免一些無(wú)謂的性能開(kāi)銷(xiāo)而提出來(lái)的,所謂延遲加載就是當(dāng)在真正需要數(shù)據(jù)的時(shí)候,才真正執(zhí)行數(shù)據(jù)加載操作。在Hibernate中提供了對(duì)實(shí)體對(duì)象的延遲加載以及對(duì)集合的延遲加載,另外在Hibernate3中還提供了對(duì)屬性的延遲加載。 A、實(shí)體對(duì)象的延遲加載 如果想對(duì)實(shí)體對(duì)象使用延遲加載,必須要在實(shí)體的映射配置文件中進(jìn)行相應(yīng)的配置,如下所示: Java代碼 1. <hibernate-mapping>   2. &

12、lt;class name=”com.neusoft.entity.User” table=”user” lazy=”true”>   3.       4. </class>   5. </hibernate-mapping>  <hibernate-mapping><class name=”com.neusoft.entity.User” table=”user” lazy=”true”> <

13、/class></hibernate-mapping>    通過(guò)將class的lazy屬性設(shè)置為true,來(lái)開(kāi)啟實(shí)體的延遲加載特性。如果我們運(yùn)行下面的代碼: User user=(User)session.load(User.class,”1”);(1) System.out.println(user.getName();(2) 當(dāng)運(yùn)行到(1)處時(shí),Hibernate并沒(méi)有發(fā)起對(duì)數(shù)據(jù)的查詢(xún),如果此時(shí)通過(guò)一些調(diào)試工具,觀(guān)察此時(shí)user對(duì)象的內(nèi)存快照,會(huì)驚奇的發(fā)現(xiàn),此時(shí)返 回的可能是User$EnhancerByCGLIB$bede8986類(lèi)型的對(duì)

14、象,而且其屬性為null,這是怎么回 事?session.load()方法會(huì)返回實(shí)體對(duì)象的代理類(lèi)對(duì)象,這里所返回的對(duì)象類(lèi)型就是User對(duì)象的代理類(lèi)對(duì)象。在Hibernate中通過(guò)使用 CGLIB,來(lái)實(shí)現(xiàn)動(dòng)態(tài)構(gòu)造一個(gè)目標(biāo)對(duì)象的代理類(lèi)對(duì)象,并且在代理類(lèi)對(duì)象中包含目標(biāo)對(duì)象的所有屬性和方法,而且所有屬性均被賦值為null。通過(guò)調(diào)試器顯 示的內(nèi)存快照,可以看出此時(shí)真正的User對(duì)象,是包含在代理對(duì)象的CGLIB$CALBACK_0.target屬性中,當(dāng)代碼運(yùn)行到(2)處時(shí),此時(shí) 調(diào)用user.getName()方法,這時(shí)通過(guò)CGLIB賦予的回調(diào)機(jī)制,實(shí)際上調(diào)用CGLIB$CALBACK_0.getNa

15、me()方法,當(dāng)調(diào)用 該方法時(shí),Hibernate會(huì)首先檢查CGLIB$CALBACK_0.target屬性是否為null,如果不為空,則調(diào)用目標(biāo)對(duì)象的getName 方法,如果為空,則會(huì)發(fā)起數(shù)據(jù)庫(kù)查詢(xún),生成類(lèi)似這樣的SQL語(yǔ)句:select * from user where id=1;來(lái)查詢(xún)數(shù)據(jù),并構(gòu)造目標(biāo)對(duì)象,并且將它賦值到CGLIB$CALBACK_0.target屬性中。 這樣,通過(guò)一個(gè)中間代理對(duì)象,Hibernate實(shí)現(xiàn)了實(shí)體的延遲加載,只有當(dāng)用戶(hù)真正發(fā)起獲得實(shí)體對(duì)象屬性的動(dòng)作時(shí),才真正會(huì)發(fā)起數(shù)據(jù)庫(kù)查詢(xún)操作。 所以實(shí)體的延遲加載是用通過(guò)中間代理類(lèi)完成的,所以只有session.lo

16、ad()方法才會(huì)利用實(shí)體延遲加載,因?yàn)橹挥衧ession.load()方 法才會(huì)返回實(shí)體類(lèi)的代理類(lèi)對(duì)象。 B、集合類(lèi)型的延遲加載 在Hibernate的延遲加載機(jī)制中,針對(duì)集合類(lèi)型的應(yīng)用,意義是最為重大的,因?yàn)檫@有可能使性能得到大幅度的提 高,為此Hibernate進(jìn)行了大量的努力,其中包括對(duì)JDK Collection的獨(dú)立實(shí)現(xiàn),在一對(duì)多關(guān)聯(lián)中,定義的用來(lái)容納關(guān)聯(lián)對(duì)象的Set集合,并不是java.util.Set類(lèi)型或其子類(lèi)型,而是 net.sf.hibernate.collection.Set類(lèi)型,通過(guò)使用自定義集合類(lèi)的實(shí)現(xiàn),Hibernate實(shí)現(xiàn)了集合類(lèi)型的延遲加載。為了 對(duì)集合類(lèi)型使用

17、延遲加載,必須如下配置實(shí)體類(lèi)的關(guān)于關(guān)聯(lián)的部分: Java代碼 1. <hibernate-mapping>   2.    <class name=”com.neusoft.entity.User” table=”user”>   3.         4.     <set name=”addresses” table=”address”

18、0;lazy=”true” inverse=”true”>   5.      <key column=”user_id”/>   6.       <one-to-many class=”com.neusoft.entity.Arrderss”/>   7.     </set>   8. &#

19、160;  </class>   9. </hibernate-mapping>  <hibernate-mapping> <class name=”com.neusoft.entity.User” table=”user”> <set name=”addresses” table=”address” lazy=”true” inverse=”true”> <key column=”user_id”/> <one-to-many class=”com.neu

20、soft.entity.Arrderss”/> </set> </class></hibernate-mapping>   通過(guò)將<set>元素的lazy屬性設(shè)置為true來(lái)開(kāi)啟集合類(lèi)型的延遲加載特性??聪旅娴拇a: Java代碼 1. User user=(User)session.load(User.class,”1”);   2. Collection addset=user.getAddresses();      

21、;(1)   3. Iterator it=addset.iterator();               (2)   4. while(it.hasNext()   5. Address address=(Address)it.next();   6. System.out.println(address.getAddress();  

22、; 7.   User user=(User)session.load(User.class,”1”);Collection addset=user.getAddresses(); (1)Iterator it=addset.iterator(); (2)while(it.hasNext()Address address=(Address)it.next();System.out.println(address.getAddress();    當(dāng)程序執(zhí)行到(1)處時(shí),并不會(huì)發(fā)起對(duì)關(guān)聯(lián)數(shù)據(jù)的查詢(xún)來(lái)加載關(guān)聯(lián)數(shù)據(jù),只有運(yùn)行到(2)處時(shí),真

23、正的數(shù)據(jù)讀取操作才會(huì)開(kāi)始,這時(shí)Hibernate會(huì)根據(jù)緩存中符合條件的數(shù)據(jù)索引,來(lái)查找符合條件的實(shí)體對(duì)象。     這里引入了一個(gè)全新的概念數(shù)據(jù)索引,下面首先將說(shuō)明什么是數(shù)據(jù)索引。在Hibernate中對(duì)集合類(lèi)型進(jìn)行緩存時(shí),是分兩部分進(jìn)行緩存的,首先緩存集合中所有實(shí)體的id列表,然后緩存實(shí)體對(duì)象,這些實(shí)體對(duì)象的id列表,就是所謂的數(shù)據(jù)索引。當(dāng)查找數(shù)據(jù)索引時(shí),如果沒(méi)有找到對(duì)應(yīng)的數(shù)據(jù)索引,這時(shí)就會(huì)一 條select SQL的執(zhí)行,獲得符合條件的數(shù)據(jù),并構(gòu)造實(shí)體對(duì)象集合和數(shù)據(jù)索引,然后返回實(shí)體對(duì)象的集合,并且將實(shí)體對(duì)象和數(shù)據(jù)索引納入Hibernate的緩存之 中。另一方

24、面,如果找到對(duì)應(yīng)的數(shù)據(jù)索引,則從數(shù)據(jù)索引中取出id列表,然后根據(jù)id在緩存中查找對(duì)應(yīng)的實(shí)體,如果找到就從緩存中返回,如果沒(méi)有找到,在發(fā) 起select SQL查詢(xún)。在這里我們看出了另外一個(gè)問(wèn)題,這個(gè)問(wèn)題可能會(huì)對(duì)性能產(chǎn)生影響,這就是集合類(lèi)型的緩存策略。如果如下配置集合類(lèi)型: Java代碼 1. <hibernate-mapping>   2.    <class name=”com.neusoft.entity.User” table=”user”>   3.   

25、;     4.     <set name=”addresses” table=”address” lazy=”true” inverse=”true”>   5.      <cache usage=”read-only”/>   6.      <key column=”user_i

26、d”/>   7.      <one-to-many class=”com.neusoft.entity.Arrderss”/>   8.     </set>   9.    </class>   10. </hibernate-mapping>  <hibernate-mapping> <c

27、lass name=”com.neusoft.entity.User” table=”user”> <set name=”addresses” table=”address” lazy=”true” inverse=”true”> <cache usage=”read-only”/> <key column=”user_id”/> <one-to-many class=”com.neusoft.entity.Arrderss”/> </set> </class></hibernate-mapping>&#

28、160;   這里應(yīng)用了<cache usage=”read-only”/>配置,如果采用這種策略來(lái)配置集合類(lèi)型,Hibernate將只會(huì)對(duì)數(shù)據(jù)索引進(jìn)行緩存,而不會(huì)對(duì)集合中的實(shí)體對(duì)象進(jìn)行緩存。如上配置運(yùn)行下面的代碼: Java代碼 1. User user=(User)session.load(User.class,”1”);   2. Collection addset=user.getAddresses();         3. Iter

29、ator it=addset.iterator();                  4. while(it.hasNext()   5. Address address=(Address)it.next();   6. System.out.println(address.getAddress();   7.   8. Sy

30、stem.out.println(“Second query”);   9. User user2=(User)session.load(User.class,”1”);   10. Collection it2=user2.getAddresses();   11. while(it2.hasNext()   12. Address address2=(Address)it2.next();   13. System.out.println(addres

31、s2.getAddress();   14.   User user=(User)session.load(User.class,”1”);Collection addset=user.getAddresses(); Iterator it=addset.iterator(); while(it.hasNext()Address address=(Address)it.next();System.out.println(address.getAddress();System.out.println(“Second query”);User user2=(

32、User)session.load(User.class,”1”);Collection it2=user2.getAddresses();while(it2.hasNext()Address address2=(Address)it2.next();System.out.println(address2.getAddress();運(yùn)行這段代碼,會(huì)得到類(lèi)似下面的輸出: Select * from user where id=1; Select * from address where user_id=1; Tianjin Dalian Second query Select * from ad

33、dress where id=1; Select * from address where id=2; Tianjin Dalian    可以看到,當(dāng)?shù)诙螆?zhí)行查詢(xún)時(shí),執(zhí)行了兩條對(duì)address表的查詢(xún)操作,為什么會(huì)這樣呢?這是因?yàn)楫?dāng)?shù)谝淮渭虞d實(shí)體后,根據(jù)集合類(lèi)型緩存策略的配 置,只對(duì)集合數(shù)據(jù)索引進(jìn)行了緩存,而并沒(méi)有對(duì)集合中的實(shí)體對(duì)象進(jìn)行緩存,所以在第二次再次加載實(shí)體時(shí),Hibernate找到了對(duì)應(yīng)實(shí)體的數(shù)據(jù)索引,但是 根據(jù)數(shù)據(jù)索引,卻無(wú)法在緩存中找到對(duì)應(yīng)的實(shí)體,所以Hibernate根據(jù)找到的數(shù)據(jù)索引發(fā)起了兩條select SQL的查詢(xún)操作,這里造成了對(duì)性能的

34、浪費(fèi),怎樣才能避免這種情況呢?必須對(duì)集合類(lèi)型中的實(shí)體也指定緩存策略,對(duì)集合類(lèi)型進(jìn)行配置: Java代碼 1. <hibernate-mapping>   2.    <class name=”com.neusoft.entity.User” table=”user”>   3.        4.     <set name=”addresses” tabl

35、e=”address” lazy=”true” inverse=”true”>   5.      <cache usage=”read-write”/>   6.      <key column=”user_id”/>   7.      <one-to-many class=”com.neusof

36、t.entity.Arrderss”/>   8.     </set>   9.    </class>   10. </hibernate-mapping>  <hibernate-mapping> <class name=”com.neusoft.entity.User” table=”user”> <set name=”addresses” table=”addres

37、s” lazy=”true” inverse=”true”> <cache usage=”read-write”/> <key column=”user_id”/> <one-to-many class=”com.neusoft.entity.Arrderss”/> </set> </class></hibernate-mapping>此時(shí)Hibernate會(huì)對(duì)集合類(lèi)型中的實(shí)體也進(jìn)行緩存,再次運(yùn)行上面的代碼,將會(huì)得到類(lèi)似如下的輸出: Select * from user where id=1; Select * fr

38、om address where user_id=1; Tianjin Dalian Second query Tianjin Dalian 這時(shí)將不會(huì)再有根據(jù)數(shù)據(jù)索引進(jìn)行查詢(xún)的SQL語(yǔ)句,因?yàn)榇藭r(shí)可以直接從緩存中獲得集合類(lèi)型中存放的實(shí)體對(duì)象。 C、屬性延遲加載     在Hibernate3中,引入了一種新的特性屬性的延遲加載,這個(gè)機(jī)制又為獲取高性能查詢(xún)提供了有力的工具。在大數(shù)據(jù)對(duì)象讀取時(shí),假設(shè)在User 對(duì)象中有一個(gè)resume字段,該字段是一個(gè)java.sql.Clob類(lèi)型,包含了用戶(hù)的簡(jiǎn)歷信息,當(dāng)加載該對(duì)象時(shí),不得不每一次都要加載這個(gè)字段,而 不論是否真的

39、需要它,而且這種大數(shù)據(jù)對(duì)象的讀取本身會(huì)帶來(lái)很大的性能開(kāi)銷(xiāo)。在Hibernate2中,只有通過(guò)面向性能的粒度細(xì)分,來(lái)分解User類(lèi),來(lái) 解決這個(gè)問(wèn)題,但是在Hibernate3中,可以通過(guò)屬性延遲加載機(jī)制,來(lái)使我們獲得只有當(dāng)我們真正需要操作這個(gè)字段時(shí),才去讀取這個(gè)字段數(shù)據(jù)的能力, 為此必須如下配置實(shí)體類(lèi): Java代碼 1. <hibernate-mapping>   2. <class name=”com.neusoft.entity.User” table=”user”>   3.   &

40、#160;    4.    <property name=”resume” type=”java.sql.Clob” column=”resume” lazy=”true”/>   5. </class>   6. </hibernate-mapping>  <hibernate-mapping><class name=”com.neusoft.entity.User” table

41、=”user”> <property name=”resume” type=”java.sql.Clob” column=”resume” lazy=”true”/></class></hibernate-mapping>    通過(guò)對(duì)<property>元素的lazy屬性設(shè)置true來(lái)開(kāi)啟屬性的延遲加載,在Hibernate3中為了實(shí)現(xiàn)屬性的延遲加載,使用了類(lèi)增強(qiáng)器來(lái)對(duì)實(shí)體類(lèi)的Class文件進(jìn)行強(qiáng)化處理,通過(guò)增強(qiáng)器的增強(qiáng),將CGLIB的回調(diào)機(jī)制邏輯,加入實(shí)體類(lèi),這里我們可以看出屬性的延遲加載,還是 通過(guò)CGL

42、IB來(lái)實(shí)現(xiàn)的。CGLIB是Apache的一個(gè)開(kāi)源工程,這個(gè)類(lèi)庫(kù)可以操縱java類(lèi)的字節(jié)碼,根據(jù)字節(jié)碼來(lái)動(dòng)態(tài)構(gòu)造符合要求的類(lèi)對(duì)象。根據(jù)上 面的配置我們運(yùn)行下面的代碼: Java代碼 1. String sql=”from User user where =zx ”;   2. Query query=session.createQuery(sql);   (1)   3. List list=query.list();  

43、; 4. for(int i=0;i<list.size();i+)   5. User user=(User)list.get(i);   6. System.out.println(user.getName();   7. System.out.println(user.getResume();   (2)   8.   String sql=”from User user where =zx ”;Query

44、 query=session.createQuery(sql); (1)List list=query.list();for(int i=0;i<list.size();i+)User user=(User)list.get(i);System.out.println(user.getName();System.out.println(user.getResume(); (2)當(dāng)執(zhí)行到(1)處時(shí),會(huì)生成類(lèi)似如下的SQL語(yǔ)句: Select id,age,name from user where name=zx; 這時(shí)Hibernate會(huì)檢索User實(shí)體中所有非延遲加載屬性對(duì)應(yīng)的字段數(shù)據(jù),

45、當(dāng)執(zhí)行到(2)處時(shí),會(huì)生成類(lèi)似如下的SQL語(yǔ)句: Select resume from user where id=1; 這時(shí)會(huì)發(fā)起對(duì)resume字段數(shù)據(jù)真正的讀取操作。九Hibernate中的一對(duì)一,一對(duì)多,多對(duì)多關(guān)聯(lián)關(guān)系1一對(duì)多關(guān)系public class Department private int id;private String name;/集合類(lèi)型必須定義成接口類(lèi)型的private Set<Employee> emps;public class Employee private int id;private String name;private Department

46、 depart;<class name="Department"><id name="id"><generator class="native" /></id><property name="name" /> <!- inverse屬性含義:是否放棄維護(hù)關(guān)聯(lián)關(guān)系? -><set name="emps" cascade="save-update" inverse="true">

47、;<key column="depart_id" /><one-to-many class="Employee" /></set></class><class name="Employee" discriminator-value="0"><id name="id"><!- <generator class="native" /> -><generator class=&qu

48、ot;hilo" /></id><property name="name" /><many-to-one name="depart" column="depart_id" /></class>2.老師和學(xué)生的多對(duì)多關(guān)系public class Teacher private int id;private String name;private Set<Student> students;public class Student private int id;p

49、rivate String name;private Set<Teacher> teachers;<class name="Teacher"><id name="id"><generator class="native" /></id><property name="name" /><set name="students" table="teacher_student"><!-先根據(jù)te

50、acher_id到中間表teacher_student中去找對(duì)應(yīng)的student_id -><key column="teacher_id" /><!- 再根據(jù)student_id到student表去查老師的信息 -><many-to-many class="Student" column="student_id" /></set></class><class name="Student"><id name="id&quo

51、t;><generator class="native" /></id><property name="name" /><set name="teachers" table="teacher_student"><!-先根據(jù)student_id到中間表teacher_student中去找對(duì)應(yīng)的teacher_id -><key column="student_id" /><!- 再根據(jù)teacher_id到teac

52、her表去查老師的信息 -><many-to-many class="Teacher" column="teacher_id" /></set></class>臟讀:一個(gè)事務(wù)讀取到另一事務(wù)未提交的更新新?lián)2豢芍貜?fù)讀:在同一事務(wù)中,多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同。換句話(huà)說(shuō)就是,后續(xù)讀取可以讀到另一事務(wù)已提交的更新數(shù)據(jù)。相反,“可重復(fù)讀”在同一事務(wù)中多次讀取數(shù)據(jù)時(shí),能夠保證所讀數(shù)據(jù)一樣,也就是,后續(xù)讀取不能讀到另一事務(wù)已提交的更新數(shù)據(jù)?;米x:一個(gè)事務(wù)讀取到另一事務(wù)已提交的insert數(shù)據(jù)。數(shù)據(jù)庫(kù)中采用鎖機(jī)制來(lái)預(yù)防并發(fā)事務(wù)的問(wèn)題。共享鎖,排他鎖,更新鎖。應(yīng)用程序中可以采用悲觀(guān)鎖和樂(lè)觀(guān)

溫馨提示

  • 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)論