Hibernate面試題_第1頁
Hibernate面試題_第2頁
Hibernate面試題_第3頁
Hibernate面試題_第4頁
Hibernate面試題_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1.Hibernate工作原理及為什么要用?原理: 1.讀取并解析配置文件 2.讀取并解析映射信息,創(chuàng)建SessionFactory 3.打開Session 4.創(chuàng)建事務(wù)Transation 5.持久化操作 6.提交事務(wù) 7.關(guān)閉Session 8.關(guān)閉SesstionFactory 為什么要用: 1). 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。 2). Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡化DAO層的編碼工作 3). hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。 4). h

2、ibernate的性能非常好,因?yàn)樗莻€輕量級框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。 2Hibernate是如何延遲加載? 1). Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對象 b)集合(Collection) 2). Hibernate3 提供了屬性的延遲加載功能 當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對數(shù)據(jù)的操作時(shí),對象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。 3Hibernate中怎樣實(shí)現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系) 類與類之間的關(guān)系主要體現(xiàn)在表與表之間

3、的關(guān)系進(jìn)行操作,它們都是對對象進(jìn)行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many 4.Hibernate中的update()和saveOrUpdate()的區(qū)別. 摘自hibernate說明文檔: saveOrUpdate()做下面的事: 如果對象已經(jīng)在本session中持久化了,不做任何事 如果另一個與本session關(guān)聯(lián)的對象擁有相同的持久化標(biāo)識(identifier),拋出一個異常 如果對象沒有持久化標(biāo)識(identifier)屬性,對其調(diào)用save() 如果對象的持久標(biāo)識(identifier)表

4、明其是一個新實(shí)例化的對象,對其調(diào)用save() 如果對象是附帶版本信息的(通過 或 ) 并且版本屬性的值表明其是一個新實(shí)例化的對象,save()它。 否則update() 這個對象5.Hibernate有哪幾種查詢數(shù)據(jù)的方式 hql查詢,sql查詢,條件查詢答:導(dǎo)航對象圖檢索 OID檢索 HQL檢索 QBC檢索 本地SQL檢索6.load()和get()的區(qū)別是什么?答:1)他們都試圖從數(shù)據(jù)庫加載一個實(shí)體對象時(shí),Session先判斷該對象是否位于緩存之中,如果存在就直接返回位于Session緩存中的持久化對象,如果修改了持久化對象的屬性,那么當(dāng)Session清理緩存時(shí),會根據(jù)持久化對象的屬性變

5、化來同步更新數(shù)據(jù)庫。2)區(qū)別: 當(dāng)數(shù)據(jù)庫中不存在與OID對應(yīng)的記錄時(shí),load()方法會拋出ObjectNotFoundException異常,而get()方法會返回null。3)兩者采用的延遲策略不同: 默認(rèn)情況下,load()方法采用延遲檢索策略()(Hibernate不會執(zhí)行select語句,金返回實(shí)體類的代理類實(shí)例,占用內(nèi)存很少);而get()采用立即檢索策略(Hibernate會立即執(zhí)行select語句)4)使用場合: 如果加載一個對象的目的是為了訪問他的各個屬性,可以get(); 如果加載一個對象的目的是為了刪除它,或者建立與別的對象的關(guān)聯(lián)關(guān)系,可以使用load();7.談?wù)刪ib

6、ernate的延遲加載和openSessionInView 延遲加載要在session范圍內(nèi),用到的時(shí)候再加載;opensessioninview是在web層寫了一個filter來打開和關(guān)閉session,這樣就表示在一次request過程中session一直開著,保證了延遲加載在session中的這個前提。8.Hibernate工作原理及為什么要用? 原理: 1).讀取并解析配置文件 2).讀取并解析映射信息,創(chuàng)建SessionFactory 3).打開Sesssion 4).創(chuàng)建事務(wù)Transation 5).持久化操作 6).提交事務(wù) 7).關(guān)閉Session 8).關(guān)閉Sesstion

7、Factory為什么要用: 1). 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。2). Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡化DAO層的編碼工作3). hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。4). hibernate的性能非常好,因?yàn)樗莻€輕量級框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。9Hibernate是如何延遲加載? 1. Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對象 b)集合(Collection)2. Hibernate3

8、提供了屬性的延遲加載功能當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對數(shù)據(jù)的操作時(shí),對象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。10.Hibernate中怎樣實(shí)現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系)類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都是對對象進(jìn)行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、11.Hibernate的查詢方式 Sql、Criteria,object comptosition Hql: 1)

9、、 屬性查詢 2)、 參數(shù)查詢、命名參數(shù)查詢 3)、 關(guān)聯(lián)查詢 4)、 分頁查詢 5)、 統(tǒng)計(jì)函數(shù)12.如何優(yōu)化Hibernate? 1).使用雙向一對多關(guān)聯(lián),不使用單向一對多 2).靈活使用單向一對多關(guān)聯(lián) 3).不用一對一,用多對一取代 4).配置對象緩存,不使用集合緩存 5).一對多集合使用Bag,多對多集合使用Set 6). 繼承類使用顯式多態(tài) 7). 表字段要少,表關(guān)聯(lián)不要怕多,有二級緩存撐腰8).制定合理的緩存策略采用合理的session管理機(jī)制盡量使用延遲加載many大文本、大文件設(shè)定合理的批處理參數(shù)(batch-size)如有可能,選用uuid作為主鍵生成器如有可能,選用基于ve

10、rsion的樂觀鎖替代悲觀鎖開發(fā)過程中,打開hibernate的SQl日志輸出(hibernate.show_sql=true),通過觀察hibernate生成的sql語句進(jìn)一步了解其實(shí)現(xiàn)原理,從而指事實(shí)上更好的實(shí)現(xiàn)策略。13.Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序?qū)嵱?,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,

11、完成數(shù)據(jù)持久化的重任。大多數(shù)開發(fā)機(jī)構(gòu)經(jīng)常采取創(chuàng)建各自獨(dú)立的數(shù)據(jù)持久層。一旦底層的數(shù)據(jù)結(jié)構(gòu)發(fā)生改變,那么修改應(yīng)用的其余部分使之適應(yīng)這種改變的代價(jià)將是十分巨大的。 Hibernate適時(shí)的填補(bǔ)了這一空白,它為Java應(yīng)用提供了一個易用的、高效率的對象關(guān)系映射框架。hibernate是個輕量級的持久性框架,功 能卻非常豐富。優(yōu)點(diǎn):a.Hibernate 使用 Java 反射機(jī)制而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。b.Hibernate 的性能非常好,因?yàn)樗莻€輕量級框架。映射的靈活性很出色。c.它支持各種關(guān)系數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。缺點(diǎn):它限制您所使用的對象模型。(例如,一個持久性類不

12、能映射到多個表)其獨(dú)有的界面和可憐的市場份額也讓人不安,盡管如此,Hibernate 還是以其強(qiáng)大的發(fā)展動力減輕了這些風(fēng)險(xiǎn)。其他的開源持久性框架也有一些,不過都沒有 Hibernate 這樣有市場沖擊力。上面回貼情緒有點(diǎn)激動,希望諒解,我不是因?yàn)橛腥伺uHibernate而感到不快,而是因?yàn)樘永锩娴挠^點(diǎn)實(shí)在讓我覺得荒謬。不管覺得 Hibernate好也吧,不好也吧,我唯一覺得遺憾的是,在中文論壇里面找不到一個對Hibernate的真正高水平的評價(jià)。在TSS上有一個關(guān)于 Hibernate的hot thread,跟了幾百貼,其中包括Hibernate作者Gavin和LiDO JDO的CTO,對

13、于JDO和Hibernate有過一些激烈的爭論,我曾經(jīng)耐心的看了一遍,仍然沒有發(fā)現(xiàn)針對Hibernate真正有力的攻擊,那些所 謂的攻擊無非針對Hibernate沒有一個GUI的配置工具,沒有商業(yè)公司支持,沒有標(biāo)準(zhǔn)化等等這些站不住腳的理由。14.補(bǔ)充幾點(diǎn)我的意見:一、Hibernate是JDBC的輕量級的對象封裝,它是一個獨(dú)立的對象持久層框架,和App Server,和EJB沒有什么必然的聯(lián)系。Hibernate可以用在任何JDBC可以使用的場合,例如Java應(yīng)用程序的數(shù)據(jù)庫訪問代碼,DAO接口 的實(shí)現(xiàn)類,甚至可以是BMP里面的訪問數(shù)據(jù)庫的代碼。從這個意義上來說,Hibernate和EB不是一

14、個范疇的東西,也不存在非此即彼的關(guān)系。二、Hibernate是一個和JDBC密切關(guān)聯(lián)的框架,所以Hibernate的兼容性和JDBC驅(qū)動,和數(shù)據(jù)庫都有一定的關(guān)系,但是和使用它的Java程序,和App Server沒有任何關(guān)系,也不存在兼容性問題。三、Hibernate不能用來直接和Entity Bean做對比,只有放在整個J2EE項(xiàng)目的框架中才能比較。并且即使是放在軟件整體框架中來看,Hibernate也是做為JDBC的替代者出現(xiàn)的,而 不是Entity Bean的替代者出現(xiàn)的,讓我再列一次我已經(jīng)列n次的框架結(jié)構(gòu):傳統(tǒng)的架構(gòu):1) Session Bean Entity Bean DB為了解決

15、性能障礙的替代架構(gòu):2) Session Bean DAO JDBC DB使用Hibernate來提高上面架構(gòu)的開發(fā)效率的架構(gòu):3) Session Bean DAO Hibernate DB就上面3個架構(gòu)來分析:1)、內(nèi)存消耗:采用JDBC的架構(gòu)2無疑是最省內(nèi)存的,Hibernate的架構(gòu)3次之,EB的架構(gòu)最差。2)、運(yùn)行效率:如果JDBC的代碼寫的非常優(yōu)化,那么JDBC架構(gòu)運(yùn)行效率最高,但是實(shí)際項(xiàng)目中,這一點(diǎn)幾乎做不到,這需要程序員非常精通JDBC,運(yùn)用 Batch語句,調(diào)整PreapredStatement的Batch Size和Fetch Size等參數(shù),以及在必要的情況下采用結(jié)果集c

16、ache等等。而一般情況下程序員是做不到這一點(diǎn)的。因此Hibernate架構(gòu)表現(xiàn)出最快的運(yùn)行效率。 EB的架構(gòu)效率會差的很遠(yuǎn)。3)、開發(fā)效率:在有JBuilder的支持下以及簡單的項(xiàng)目,EB架構(gòu)開發(fā)效率最高,JDBC次之,Hibernate最差。但是在大的項(xiàng)目,特別是持久層關(guān)系映射很復(fù)雜的情況下,Hibernate效率高的驚人,JDBC次之,而EB架構(gòu)很可能會失敗。4)、分布式,安全檢查,集群,負(fù)載均衡的支持由于有SB做為Facade,3個架構(gòu)沒有區(qū)別。15.EJB和Hibernate學(xué)習(xí)難度在哪里?EB的難度在哪里?不在復(fù)雜的XML配置文件上,而在于EB運(yùn)用稍微不慎,就有嚴(yán)重的性能障礙。所以

17、難在你需要學(xué)習(xí)很多EJB設(shè)計(jì)模式來避開性能問題,需 要學(xué)習(xí)App Server和EB的配置來優(yōu)化EB的運(yùn)行效率。做EB的開發(fā)工作,程序員的大部分精力都被放到了EB的性能問題上了,反而沒有更多的精力關(guān)注本身就主要 投入精力去考慮的對象持久層的設(shè)計(jì)上來。Hibernate難在哪里?不在Hibernate本身的復(fù)雜,實(shí)際上Hibernate非常的簡單,難在Hibernate太靈活了。當(dāng)你用EB來實(shí)現(xiàn)持久層的時(shí)候,你會發(fā)現(xiàn)EB實(shí)在是太笨拙了,笨拙到你根本沒有什么可以選擇的余地,所以你根本就不用花費(fèi)精力去設(shè)計(jì)方案,去平衡方案的好壞,去費(fèi)腦筋考慮選擇哪個方案,因?yàn)橹挥形ㄒ坏姆桨笖[在你面前,你只能這么做,沒

18、得選擇。Hibernate相反,它太靈活了,相同的問題,你至少可以設(shè)計(jì)出十幾種方案來解決,所以特別的犯難,究竟用這個,還是用那個呢?這些方案之間到底有什 么區(qū)別呢?他們的運(yùn)行原理有什么不同?運(yùn)行效率哪個比較好?光是主鍵生成,就有七八種方案供你選擇,你為難不為難?集合屬性可以用Set,可以用 List,還可以用Bag,到底哪個效率高,你為難不為難?查詢可以用iterator,可以用list,哪個好,有什么區(qū)別?你為難不為難?復(fù)合主鍵你 可以直接在hbm里面配置,也可以自定義CustomerType,哪種比較好些?你為難不為難?對于一個表,你可以選擇單一映射一個對象,也可以映射成 父子對象,還可以

19、映射成兩個1:1的對象,在什么情況下用哪種方案比較好,你為難不為難?這個列表可以一直開列下去,直到你不想再看下去為止。當(dāng)你面前擺著無數(shù)的眼花繚亂的方案的時(shí)候,你會覺得幸福呢?還是悲哀呢?如果你是一個負(fù)責(zé)的程序員, 那么你一定會仔細(xì)研究每種方案的區(qū)別,每種方案的效率,每種方案的適用場合,你會覺得你已經(jīng)陷入進(jìn)去拔不出來了。如果是用EB,你第一秒種就已經(jīng)做出了決 定,根本沒得選擇,比如說集合屬性,你只能用Collection,如果是Hibernate,你會在Bag,List和Set之間來回猶豫不決,甚至搞 不清楚的話,程序都沒有辦法寫。16.在Hibernate應(yīng)用中Java對象的狀態(tài)有哪些?答案:

20、1)瞬時(shí)狀態(tài)(transient):由剛new語句創(chuàng)建,且沒有與Hibernate Session關(guān)聯(lián)的對象被稱為瞬時(shí)的。瞬時(shí)對象不會被持久化到數(shù)據(jù)庫中,也不會被賦予持久化標(biāo)示符(identifier).如果瞬時(shí)對象在程序中沒有被引用,他會被垃圾回收器回收,使用Hibernate Session可以將其持久化 .通過save() ,saveOrUpdate() ,persist(),merge() 的方法將瞬時(shí)對象變?yōu)槌志没癄顟B(tài) .通過get(),load(),Query.list(),Query.uniqueResult(),Query.iterate(),Query.getResultLi

21、st(),Query.SingleResult(),方法將一個對象變?yōu)槌志没瘜ο?)持久化狀態(tài)(persistent):持久化的實(shí)例在數(shù)據(jù)庫中有對應(yīng)的記錄,它存在于相關(guān)聯(lián)的Hibernate Session范圍內(nèi),即加入到Session的緩存中。 .持久化狀態(tài)通過evict(),close(),clear()等方法會變成托管狀態(tài)3)托管狀態(tài)(detached):持久化對象關(guān)聯(lián)的Session被關(guān)閉后,對象變?yōu)橥泄軤顟B(tài),托管對象的引用依然有效,對象可以繼續(xù)被修改。托管對象如果重新關(guān)聯(lián)到某個新的Hibernate Session上,會再次轉(zhuǎn)為持久化。 .托管狀態(tài)通過update() saveOrU

22、pdate(),merge()等方法會變?yōu)槌志没癄顟B(tài)4)刪除狀態(tài)(Remove):從一個Hibernate Session實(shí)例緩存之中刪除,Session已經(jīng)計(jì)劃將其從數(shù)據(jù)庫刪除,Session在清理緩存時(shí),會執(zhí)行SQL delete語句,刪除數(shù)據(jù)庫中對應(yīng)的記錄。值得注意的是刪除的是對象標(biāo)示存在但在一般情況下,應(yīng)用程序不該在使用被刪除的對象17.1.什么是清理緩存?答:1)清理緩存是是指Session按照緩存中庫對象的屬性變化來同步更新數(shù)據(jù)庫。 Session在緩存進(jìn)行清理時(shí)會自動進(jìn)行臟檢查(沒有與數(shù)據(jù)庫同步的數(shù)據(jù)被稱為臟數(shù)據(jù)),如果發(fā)現(xiàn)Session緩存中的對象與數(shù)據(jù)庫中相應(yīng)的記錄不一致,就

23、會同步數(shù)據(jù)庫。17.2.緩存何時(shí)清理?1Session緩存中對象的屬性每次發(fā)生變化,Session不會立即清理緩存以及執(zhí)行相關(guān)的update語句,而是在特定的時(shí)間才清理緩存,這樣Session就能將幾條特定的sql語句合并為一條sql語句,因此就減少了對數(shù)據(jù)庫的訪問次數(shù)。2Session會在下面的時(shí)間點(diǎn)清理緩存:A).當(dāng)應(yīng)用程序顯示的調(diào)用Session的flush()方法時(shí)。此時(shí)的清理緩存(此時(shí)緩存中的數(shù)據(jù)并不丟失)操作,讓緩存和數(shù)據(jù)庫同步執(zhí)行一些sql語句,但不提交事務(wù)。B).當(dāng)程序在事務(wù)下調(diào)用commit()方法時(shí),commit方法先清理緩存(調(diào)用flush()方法)然后向數(shù)據(jù)庫提交事務(wù)。

24、C).當(dāng)執(zhí)行一些查詢操作時(shí),如果緩存中持久化對象的某些屬性發(fā)生變化,就會先清理緩存,使得Session緩存與數(shù)據(jù)庫同步,從而保證查詢結(jié)果返回的是正確數(shù)據(jù) 18.Session如何進(jìn)行臟檢查?簡述緩存的管理?答:(1)當(dāng)一個對象被加入到Session緩存時(shí),Session會為該對象的值類型的屬性復(fù)制一份快照,當(dāng)Session清理緩存時(shí),會進(jìn)行臟檢查,即比較對象的當(dāng)前屬性與他的快照,來判斷對象屬性是否發(fā)生變化,如果發(fā)生變化,就稱這個對象是臟對象,Session會根據(jù)對象的新屬性來執(zhí)行相關(guān)的SQL語句,從而同步更新數(shù)據(jù)庫(2).*第一級緩存正常情況下是又Hibernate自動維護(hù)的。 *在特殊情況下

25、需要我們進(jìn)行手動維護(hù)(何為手動維護(hù)),Hibernate提供了兩個管理Session的緩存方法: .void evict(evict ivikt驅(qū)逐)(Object obj):把某個持久化對象從Session的緩存中清空,該方法在兩個情況下適用,一是特定的操作(如批處理),需要及時(shí)釋放對象占用的內(nèi)存,二是不希望當(dāng)前的Session繼續(xù)運(yùn)用此對象的狀態(tài)變化來同步更新數(shù)據(jù)庫。 .void clear():清理緩存中的所有持久化對象 *在多數(shù)情況下并不提倡通過evict()和clear()來管理一級緩存 *管理一級緩存最合理的方式是采用合理的檢索策略和檢索方式來節(jié)省內(nèi)存的開銷。19.映射繼承關(guān)系的三

26、種方式/策略?答:(1)每個類分層結(jié)構(gòu)一張表:對于繼承關(guān)系中的子類使用同一張表,這就需要在數(shù)據(jù)庫表中增加額外的區(qū)分子類類型的字段,這個額外的字段被稱為辨別者列(discriminator)。配置文件如下: . 注意:所有的子類字段都不允許為非空約束(2)繼承關(guān)系中的每個子類對應(yīng)一張表,每個表中只包括和這個類本身屬性對應(yīng)的字段,子類的表參照父類對應(yīng)的表。配置我文件如下: . (3)繼承關(guān)系中的每個具體類對應(yīng)一張表:將域模型中的每一個實(shí)體對象映射到一個獨(dú)立的表中,也就是不用再關(guān)系數(shù)據(jù)模型中考慮模型的繼承和多態(tài)(在具體類對應(yīng)的表中,不僅包含和具體類屬性對應(yīng)的字段,還包括與具體類的父類屬性對應(yīng)的字段。

27、)配置文件如下: . 注意:同一類繼承層次中所有實(shí)體類都需要使用同一個主鍵種子(即需要同一個id),即多個持久化實(shí)體對應(yīng)的記錄的主鍵應(yīng)該是連續(xù)的20映射一對多雙向關(guān)聯(lián)關(guān)系中設(shè)置SET元素:請寫出級聯(lián)保存和更新、級聯(lián)刪除應(yīng)在set元素中需要設(shè)置那些子元素?(標(biāo)明關(guān)系、避面重復(fù)執(zhí)行多余SQL語句)Name cascade key column one-to-many inverse21.請介紹Session以及它的特點(diǎn)有哪些?1)Session建立一個會話,它是應(yīng)用程序與數(shù)據(jù)庫之間交互操作的一個單線程對象,是Hibernate的運(yùn)作中心,所有持久化對象必須在Session管理下才能進(jìn)行持久化操作所

28、有持久層操作的數(shù)據(jù)都換存在session對象處(相當(dāng)于jdbc的Connection)。它提供了和持久化相關(guān)的操作,如添加、更新、刪除、加載和查詢對象。注意:Session有連個區(qū)域裝兩個對象:臨時(shí)和持久2)*.是線程不安全的,因此在設(shè)計(jì)軟件架構(gòu)時(shí),應(yīng)該避免多個線程共享同一個Session實(shí)例。*.Session實(shí)例是輕量級的,所謂輕量級是指它的創(chuàng)建和銷毀不需要消耗太多的資源。這意味著在程序中可以經(jīng)常創(chuàng)建或銷毀Session對象,例如為每個客戶請求分配單獨(dú)的Session實(shí)例,或者為每個工作單元分配單獨(dú)的Session實(shí)例。*.在Session 中,每個數(shù)據(jù)庫操作都是在一個事務(wù)(transac

29、tion)中進(jìn)行的,這樣就可以隔離開不同的操作(甚至包括只讀操作)。3)Session類的一些方法:*.取得持久化對象的方法:get(),load()*.持久化對象保存更新和刪除:save(),update(),saveOrUpdate(),delete()*.開啟事務(wù):beginTransaction*.獲得已開啟事務(wù):getTransaction*.管理Session的方法:isOpen(),clear(),flush(),evict(),close()22.Hibernate中采用XML文件來配置對象-關(guān)系映射的優(yōu)點(diǎn)有那些?答案:Hibernate既不會滲透到上層域模型中,也不會滲透到下

30、層數(shù)據(jù)模型中。軟件開發(fā)人員可以獨(dú)立設(shè)計(jì)域模型,不必強(qiáng)迫遵守任何規(guī)范。數(shù)據(jù)庫設(shè)計(jì)人員可以獨(dú)立設(shè)計(jì)數(shù)據(jù)模型,不必強(qiáng)迫遵守任何規(guī)范。對象-關(guān)系映射不依賴于任何程序代碼,如果需要修改對象-關(guān)系映射,只需修改XML文件,不需要修改任何程序,提高了軟件的靈活性,并且使維護(hù)更加方便。23.save()/persist()區(qū)別是什么? save()方法把一個瞬間對象加入到Session緩存中,并持久化該瞬時(shí)對象,計(jì)劃執(zhí)行一個insert語句,計(jì)劃執(zhí)行insert語句并不是立即發(fā)送SQL語句。在依賴數(shù)據(jù)庫產(chǎn)生主鍵的情況下會立即發(fā)送SQL語句訪問數(shù)據(jù)庫,目的是確保為持久化對象的ID賦值,而非數(shù)據(jù)庫產(chǎn)生主鍵方式,是

31、到清理緩存時(shí)才發(fā)送SQL語句 persist()和save()方法類似,hibernate3才出現(xiàn)區(qū)別: save()方法會返回對象的ID,而persist()方法會什么都不返回 如果在事務(wù)邊界以外調(diào)用persist()方法,那么該方法不會執(zhí)行insert語句,這可以提高負(fù)責(zé)長時(shí)間運(yùn)行事務(wù)的程序的健壯性。而save()方法,不管是事務(wù)邊界以外或者以內(nèi)調(diào)用它,都會執(zhí)行insert語句(使用數(shù)據(jù)庫產(chǎn)生主鍵的方式)24 敘述Session的緩存的作用答案:(1)減少訪問數(shù)據(jù)庫的頻率。應(yīng)用程序從內(nèi)存中讀取持久化對象的速度顯然比到數(shù)據(jù)庫中查詢數(shù)據(jù)的速度快多了,因此Session的緩存可以提高數(shù)據(jù)訪問的性

32、能。(2)保證緩存中的對象與數(shù)據(jù)庫中的相關(guān)記錄保持同步。當(dāng)緩存中持久化對象的狀態(tài)發(fā)生了變換,Session并不會立即執(zhí)行相關(guān)的SQL語句,這使得Session能夠把幾條相關(guān)的SQL語句合并為一條SQL語句,以便減少訪問數(shù)據(jù)庫的次數(shù),從而提高應(yīng)用程序的性能。25.比較Hibernate的三種檢索策略優(yōu)缺點(diǎn),分別適用于哪種場合?答案:1)立即檢索;優(yōu)點(diǎn):對應(yīng)用程序完全透明,不管對象處于持久化狀態(tài),還是托管狀態(tài),應(yīng)用程序都可以方便的從一個對象導(dǎo)航到與它關(guān)聯(lián)的對象;缺點(diǎn):1.select語句太多;2.可能會加載應(yīng)用程序不需要訪問的對象白白浪費(fèi)許多內(nèi)存空間;2)延遲檢索:優(yōu)點(diǎn):由應(yīng)用程序決定需要加載哪些

33、對象,可以避免可執(zhí)行多余的select語句,以及避免加載應(yīng)用程序不需要訪問的對象,節(jié)省內(nèi)存空間,提高檢索效率缺點(diǎn):應(yīng)用程序如果希望訪問托管狀態(tài)代理類實(shí)例,必須保證他在持久化狀態(tài)時(shí)已經(jīng)被初始化;適用:一對多或多對多關(guān)聯(lián)。應(yīng)用程序不需要立即訪問或者根本不會訪問的對象。3).迫切左外連接檢索優(yōu)點(diǎn):1對應(yīng)用程序完全透明,不管對象處于持久化狀態(tài),還是托管狀態(tài),應(yīng)用程序都可以方便的從一個對象導(dǎo)航到另一個與它相關(guān)聯(lián)的對象。2使用了外連接,select語句數(shù)目少。缺點(diǎn):1可能會加載應(yīng)用程序不需要訪問的對象,白白浪費(fèi)許多內(nèi)存空間;2復(fù)雜的數(shù)據(jù)庫表連接也會影響檢索性能;適用:一對一或多對一關(guān)聯(lián)。應(yīng)用程序需要立即訪

34、問的對象。數(shù)據(jù)庫系統(tǒng)具有良好的表連接性能。26.多個事務(wù)并發(fā)運(yùn)行時(shí)的并發(fā)問題有哪些?答案 第一類丟失更新;臟讀;虛讀;不可重復(fù)讀;第二類丟失更新;27.ORM(對象關(guān)系映射)解決的不匹配問題(域模型與關(guān)系模型之間存在的不匹配)答:域模型是面向?qū)ο蟮?,關(guān)系模型是面向關(guān)系的。域模型中有繼承關(guān)系,關(guān)系模型中不能直接表示繼承關(guān)系。域模型中有多對多關(guān)聯(lián)關(guān)系,關(guān)系模型中通過連接表來表示多對多關(guān)聯(lián)關(guān)系。域模型中有雙向關(guān)聯(lián)關(guān)系,關(guān)系模型中只有單向參照關(guān)系,而且總是many參照one方。域模型提倡精粒度模型,關(guān)系模型提倡粗粒度模型。28.session的清理和清空有什么區(qū)別?session清理緩存是指按照緩存中

35、對象的狀態(tài)的變化來同步更新數(shù)據(jù)庫;清空是session關(guān)閉;29.關(guān)聯(lián):one-to-manyinverse:主控方,外鍵的關(guān)系有誰控制inverse=false 是主控方,外鍵是由它控制的inverse=true 是被控方,外鍵與它沒關(guān)系要想實(shí)現(xiàn)主控方的控制必須將被控方作為主控方的屬性cascade:級聯(lián)主表增從表增主表修從表修主表刪從表刪lazy:延遲 lazy=false:一下將所有的內(nèi)容取出,不延時(shí)(常用)lazy=true:取出部分內(nèi)容,其余內(nèi)容動態(tài)去取通過get可以取出對方的所有內(nèi)容30.hibernate中的one-to-many或many-to-one中常用的方式是什么? 主控

36、方在many這邊,不及連刪除31.iBatis與Hibernate有什么不同?相同點(diǎn):屏蔽jdbc api的底層訪問細(xì)節(jié),使用我們不用與jdbc api打交道,就可以訪問數(shù)據(jù)。jdbc api編程流程固定,還將sql語句與java代碼混雜在了一起,經(jīng)常需要拼湊sql語句,細(xì)節(jié)很繁瑣。ibatis的好處:屏蔽jdbc api的底層訪問細(xì)節(jié);將sql語句與java代碼進(jìn)行分離;提供了將結(jié)果集自動封裝稱為實(shí)體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實(shí)體對象的屬性傳遞給sql語句的參數(shù)。Hibernate是一個全自動的orm

37、映射工具,它可以自動生成sql語句,ibatis需要我們自己在xml配置文件中寫sql語句,hibernate要比ibatis功能負(fù)責(zé)和強(qiáng)大很多。因?yàn)閔ibernate自動生成sql語句,我們無法控制該語句,我們就無法去寫特定的高效率的sql。對于一些不太復(fù)雜的sql查詢,hibernate可以很好幫我們完成,但是,對于特別復(fù)雜的查詢,hibernate就很難適應(yīng)了,這時(shí)候用ibatis就是不錯的選擇,因?yàn)閕batis還是由我們自己寫sql語句。32.介紹一下Hibernate的二級緩存按照以下思路來回答:(1)首先說清楚什么是緩存,(2)再說有了hibernate的Session就是一級緩存

38、,即有了一級緩存,為什么還要有二級緩存,(3)最后再說如何配置Hibernate的二級緩存。(1)緩存就是把以前從數(shù)據(jù)庫中查詢出來和使用過的對象保存在內(nèi)存中(一個數(shù)據(jù)結(jié)構(gòu)中),這個數(shù)據(jù)結(jié)構(gòu)通常是或類似Hashmap,當(dāng)以后要使用某個對象時(shí),先查詢緩存中是否有這個對象,如果有則使用緩存中的對象,如果沒有則去查詢數(shù)據(jù)庫,并將查詢出來的對象保存在緩存中,以便下次使用。下面是緩存的偽代碼:引出hibernate的第二級緩存,用下面的偽代碼分析了Cache的實(shí)現(xiàn)原理Daohashmap map = new map();User getUser(integer id)User user = map.get

39、(id)if(user = null)user = session.get(id);map.put(id,user);return user;DaoCache cache = nullsetCache(Cache cache)this.cache = cacheUser getUser(int id)if(cache!=null)User user = cache.get(id);if(user =null)user = session.get(id);cache.put(id,user);return user;return session.get(id);(2)Hibernate的Sess

40、ion就是一種緩存,我們通常將之稱為Hibernate的一級緩存,當(dāng)想使用session從數(shù)據(jù)庫中查詢出一個對象時(shí),Session也是先從自己內(nèi)部查看是否存在這個對象,存在則直接返回,不存在才去訪問數(shù)據(jù)庫,并將查詢的結(jié)果保存在自己內(nèi)部。由于Session代表一次會話過程,一個Session與一個數(shù)據(jù)庫連接相關(guān)連,所以Session最好不要長時(shí)間保持打開,通常僅用于一個事務(wù)當(dāng)中,在事務(wù)結(jié)束時(shí)就應(yīng)關(guān)閉。并且Session是線程不安全的,被多個線程共享時(shí)容易出現(xiàn)問題。通常只有那種全局意義上的緩存才是真正的緩存應(yīng)用,才有較大的緩存價(jià)值,因此,Hibernate的Session這一級緩存的緩存作用并不明

41、顯,應(yīng)用價(jià)值不大。Hibernate的二級緩存就是要為Hibernate配置一種全局緩存,讓多個線程和多個事務(wù)都可以共享這個緩存。我們希望的是一個人使用過,其他人也可以使用,session沒有這種效果。(3)二級緩存是獨(dú)立于Hibernate的軟件部件,屬于第三方的產(chǎn)品,多個廠商和組織都提供有緩存產(chǎn)品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個廠家的緩存產(chǎn)品,接著需要配置該緩存產(chǎn)品自己的配置文件,最后要配置Hibernate中的哪些實(shí)體對象要納入到二級緩存的管理中。明白了二級緩存原理和有了這個

42、思路后,很容易配置起Hibernate的二級緩存。擴(kuò)展知識:一個SessionFactory可以關(guān)聯(lián)一個二級緩存,也即一個二級緩存只能負(fù)責(zé)緩存一個數(shù)據(jù)庫中的數(shù)據(jù),當(dāng)使用Hibernate 的二級緩存后,注意不要有其他的應(yīng)用或SessionFactory來更改當(dāng)前數(shù)據(jù)庫中的數(shù)據(jù),這樣緩存的數(shù)據(jù)就會與數(shù)據(jù)庫中的實(shí)際數(shù)據(jù)不一致。 33.Query1).個或多個屬性查詢:Query query=session.createQuery(”select customername,customerid from Customer”)List l=query.list();For(int i=0;il.siz

43、e();i+)Obejct object=(Object)l.get(i);Object0 object1 2).配置的查詢,在*.hbm.xml中 Query query=session.getNamedQuery(sql);34.ORM解決的不匹配問題(域模型與關(guān)系模型之間存在的不匹配)答: 域模型是面向?qū)ο蟮?,關(guān)系模型是面向關(guān)系的。域模型中有繼承關(guān)系,關(guān)系模型中不能直接表示繼承關(guān)系。域模型中有多對多關(guān)聯(lián)關(guān)系,關(guān)系模型中通過連接表來表示多對多關(guān)聯(lián)關(guān)系。域模型中有雙向關(guān)聯(lián)關(guān)系,關(guān)系模型中只有單向參照關(guān)系,而且總是many參照one方。域模型提倡精粒度模型,關(guān)系模型提倡粗粒度模型。35.說下H

44、ibernate的緩存機(jī)制1). 內(nèi)部緩存存在Hibernate中又叫一級緩存,屬于應(yīng)用事物級緩存2). 二級緩存: a 應(yīng)用及緩存 b 分布式緩存 條件:數(shù)據(jù)不會被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非 關(guān)鍵數(shù)據(jù) c 第三方緩存的實(shí)現(xiàn)36.談?wù)勀銓ibernate的理解。答:1). 面向?qū)ο笤O(shè)計(jì)的軟件內(nèi)部運(yùn)行過程可以理解成就是在不斷創(chuàng)建各種新對象、建立對象之間的關(guān)系,調(diào)用對象的方法來改變各個對象的狀態(tài)和對象消亡的過程,不管程序運(yùn)行的過程和操作怎么樣,本質(zhì)上都是要得到一個結(jié)果,程序上一個時(shí)刻和下一個時(shí)刻的運(yùn)行結(jié)果的差異就表現(xiàn)在內(nèi)存中的對象狀態(tài)發(fā)生了變化。

45、2).為了在關(guān)機(jī)和內(nèi)存空間不夠的狀況下,保持程序的運(yùn)行狀態(tài),需要將內(nèi)存中的對象狀態(tài)保存到持久化設(shè)備和從持久化設(shè)備中恢復(fù)出對象的狀態(tài),通常都是保存到關(guān)系數(shù)據(jù)庫來保存大量對象信息。從Java程序的運(yùn)行功能上來講,保存對象狀態(tài)的功能相比系統(tǒng)運(yùn)行的其他功能來說,應(yīng)該是一個很不起眼的附屬功能,java采用jdbc來實(shí)現(xiàn)這個功能,這個不起眼的功能卻要編寫大量的代碼,而做的事情僅僅是保存對象和恢復(fù)對象,并且那些大量的jdbc代碼并沒有什么技術(shù)含量,基本上是采用一套例行公事的標(biāo)準(zhǔn)代碼模板來編寫,是一種苦活和重復(fù)性的工作。3).通過數(shù)據(jù)庫保存java程序運(yùn)行時(shí)產(chǎn)生的對象和恢復(fù)對象,其實(shí)就是實(shí)現(xiàn)了java對象與關(guān)系數(shù)據(jù)庫記錄的映射關(guān)系,稱為ORM(即Object Relation Mapping),人們可以通過封裝JDBC代碼來實(shí)現(xiàn)了這種功能,封裝出來的產(chǎn)品稱之為ORM框架,Hibernate就是其中的一種流行ORM框架。使用Hibernate框架,不用寫JDBC代碼,僅僅是調(diào)用一個save方法,就可以將對象保存到關(guān)系數(shù)據(jù)庫中,僅僅是調(diào)用一個get方法,就可以從數(shù)據(jù)庫中加載出一個對象。4).使用Hibernate的基本流程是:配置

溫馨提示

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

評論

0/150

提交評論