新聞中心
在Java J2EE方面進行面試時,常被問起的Hibernate面試問題,大多都是針對基于Web的企業(yè)級應用開發(fā)者的角色的。Hibernate框架在Java 界的成功和高度的可接受性使得它成為了Java技術(shù)棧中最受歡迎的對象關(guān)系影射(ORM)解決方案。Hibernate將你從數(shù)據(jù)庫相關(guān)的編碼中解脫了出來,使你可以更加專注地利用強大的面向?qū)ο蟮脑O計原則來實現(xiàn)核心的業(yè)務邏輯。采用Hibernate后,你就能夠相當容易地在不同的數(shù)據(jù)庫間進行切換,而且你還可以利用Hibernate提供的開箱即用的二級緩存以及查詢緩存功能。你也知道,大部分Java面試中所提的問題不僅僅會涉及Java的核心部分,而且還會涉及其它的Java框架,比如,根據(jù)項目的要求也有可能會問到Spring 框架方面的問題或者Struts方面的問題。如果你要參加的項目使用了Hibernate作為ORM解決方案,你就英國同時準備好回答Spring和Hibernate這兩個框架方面的問題。好好看看JD或者職位說明,如果其中的任何地方出現(xiàn)了Hibernate這個詞,就要準備好怎樣來面對Hibernate方面的問題。

創(chuàng)新互聯(lián)秉承實現(xiàn)全網(wǎng)價值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),網(wǎng)站制作、成都網(wǎng)站制作,成都小程序開發(fā),網(wǎng)頁設計制作,手機網(wǎng)站制作,成都全網(wǎng)營銷幫助傳統(tǒng)企業(yè)實現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對客戶都以感恩的心態(tài)奉獻自己的專業(yè)和所長。
本文給出了一個Hibernate面試問題列表,這些都是我從朋友以及同事那里搜集來的。Hibernate 是一個非常流行的對象關(guān)系影射框架,熟稔Hibernate的優(yōu)勢所在和Hibernate的Sesion API是搞定Hibernate面試之關(guān)鍵所在。
Hibernate中g(shù)et和load有什么不同之處? 把get和load放到一起進行對比是Hibernate面試時最常問到的問題,這是因為只有正確理解get()和load()這二者后才有可能高效地使用Hibernate。get和load的最大區(qū)別是,如果在緩存中沒有找到相應的對象,get將會直接訪問數(shù)據(jù)庫并返回一個完全初始化好的對象,而這個過程有可能會涉及到多個數(shù)據(jù)庫調(diào)用;而load方法在緩存中沒有發(fā)現(xiàn)對象的情況下,只會返回一個代理對象,只有在對象getId()之外的其它方法被調(diào)用時才會真正去訪問數(shù)據(jù)庫,這樣就能在某些情況下大幅度提高性能。你也可以參考 Hibernate中g(shù)et和load的不同之處, 此鏈接給出了更多的不同之處并對該問題進行了更細致的討論。
Hibernate中save、persist和saveOrUpdate這三個方法的不同之處?除了get和load,這又是另外一個經(jīng)常出現(xiàn)的Hibernate面試問題。 所有這三個方法,也就是save()、saveOrUpdate()和persist()都是用于將對象保存到數(shù)據(jù)庫中的方法,但其中有些細微的差別。例如,save()只能INSERT記錄,但是saveOrUpdate()可以進行 記錄的INSERT和UPDATE。還有,save()的返回值是一個Serializable對象,而persist()方法返回值為void。你還可以訪問 save、persist以及saveOrUpdate,找到它們所有的不同之處。
Hibernate中的命名SQL查詢指的是什么? Hibernate的這個面試問題同Hibernate提供的查詢功能相關(guān)。命名查詢指的是用
Hibernate中的SessionFactory有什么作用? SessionFactory是線程安全的嗎? 這也是Hibernate框架的常見面試問題。顧名思義,SessionFactory就是一個用于創(chuàng)建Hibernate的Session對象的工廠。 SessionFactory通常是在應用啟動時創(chuàng)建好的,應用程序中的代碼用它來獲得Session對象。作為一個單個的數(shù)據(jù)存儲,它也是 線程安全的,所以多個線程可同時使用同一個SessionFactory。Java JEE應用一般只有一個SessionFactory,服務于客戶請求的各線程都通過這個工廠來獲得Hibernate的Session實例,這也是為什么SessionFactory接口的實現(xiàn)必須是線程安全的原因。還有,SessionFactory的內(nèi)部狀態(tài)包含著同對象關(guān)系影射有關(guān)的所有元數(shù)據(jù),它是 不可變的,一旦創(chuàng)建好后就不能對其進行修改了。
Hibernate中的Session指的是什么? 可否將單個的Session在多個線程間進行共享? 前面的問題問完之后,通常就會接著再問這兩個問題。問完SessionFactory的問題后就該輪到Session了。Session代表著Hibernate所做的一小部分工作,它負責維護者同數(shù)據(jù)庫的鏈接而且
不是線程安全的,也就是說,Hibernage中的Session不能在多個線程間進行共享。雖然Session會以主動滯后的方式獲得數(shù)據(jù)庫連接,但是Session最好還是在用完之后立即將其關(guān)閉。
hibernate中sorted collection和ordered collection有什么不同? T這個是你會碰到的所有Hibernate面試問題中比較容易的問題。sorted collection是通過使用
Java的Comparator在內(nèi)存中進行排序的,ordered collection中的排序用的是數(shù)據(jù)庫的order by子句。對于比較大的數(shù)據(jù)集,為了避免在內(nèi)存中對它們進行排序而出現(xiàn)
Java中的OutOfMemoryError,最好使用ordered collection。
Hibernate中transient、persistent、detached對象三者之間有什么區(qū)別?在Hibernate中,對象具有三種狀態(tài):transient、persistent和detached。同Hibernate的session有關(guān)聯(lián)的對象是persistent對象。對這種對象進行的所有修改都會按照事先設定的刷新策略,反映到數(shù)據(jù)庫之中,也即,可以在對象的任何一個屬性發(fā)生改變時自動刷新,也可以通過調(diào)用Session.flush()方法顯式地進行刷新。如果一個對象原來同Session有關(guān)聯(lián)關(guān)系,但當下卻沒有關(guān)聯(lián)關(guān)系了,這樣的對象就是detached的對象。你可以通過調(diào)用任意一個session的update()或者saveOrUpdate()方法,重新將該 detached對象同相應的seesion建立關(guān)聯(lián)關(guān)系。Transient對象指的是新建的持久化類的實例,它還從未同Hibernate的任何 Session有過關(guān)聯(lián)關(guān)系。同樣的,你可以調(diào)用persist()或者save()方法,將transient對象變成persistent對象??梢涀?,這里所說的transient指的可不是 Java中的transient關(guān)鍵字,二者風馬牛不相及。
Hibernate中Session的lock()方法有什么作用? 這是一個比較棘手的Hibernate面試問題,因為Session的lock()方法重建了關(guān)聯(lián)關(guān)系卻并沒有同數(shù)據(jù)庫進行同步和更新。因此,你在使用 lock()方法時一定要多加小心。順便說一下,在進行關(guān)聯(lián)關(guān)系重建時,你可以隨時使用Session的update()方法同數(shù)據(jù)庫進行同步。有時這個問題也可以這么來問:Session的lock()方法和update()方法之間有什么區(qū)別?。這個小節(jié)中的關(guān)鍵點也可以拿來回答這個問題。
Hibernate中二級緩存指的是什么? 這是同Hibernate的緩存機制相關(guān)的第一個面試問題,不出意外后面還會有更多這方面的問題。二級緩存是在SessionFactory這個級別維護的緩存,它能夠通過節(jié)省幾番數(shù)據(jù)庫調(diào)用往返來提高性能。還有一點值得注意,二級緩存是針對整個應用而不是某個特定的session的。
Hibernate中的查詢緩存指的是什么? 這個問題有時是作為上個Hibernate面試問題的后繼問題提出的。查詢緩存實際上保存的是sql查詢的結(jié)果,這樣再進行相同的sql查詢就可以之間從緩存中拿到結(jié)果了。為了改善性能,查詢緩存可以同二級緩存一起來使用。Hibernate支持用多種不同的開源緩存方案,比如EhCache,來實現(xiàn)查詢緩存。
為什么在Hibernate的實體類中要提供一個無參數(shù)的構(gòu)造器這一點非常重要?
每個Hibernate實體類必須包含一個 無參數(shù)的構(gòu)造器, 這是因為Hibernate框架要使用Reflection API,通過調(diào)用Class.newInstance()來創(chuàng)建這些實體類的實例。如果在實體類中找不到無參數(shù)的構(gòu)造器,這個方法就會拋出一個InstantiationException異常。
可不可以將Hibernate的實體類定義為final類?
是的,你可以將Hibernate的實體類定義為final類,但這種做法并不好。因為Hibernate會使用代理模式在延遲關(guān)聯(lián)的情況下提高性能,如果你把實體類定義成final類之后,因為 Java不允許對final類進行擴展,所以Hibernate就無法再使用代理了,如此一來就限制了使用可以提升性能的手段。不過,如果你的持久化類實現(xiàn)了一個接口而且在該接口中聲明了所有定義于實體類中的所有public的方法輪到話,你就能夠避免出現(xiàn)前面所說的不利后果。
Java開發(fā)者的Hibernate面試問答列表就到此為止了。沒人會對Hibernate作為ORM解決方案的受歡迎程度產(chǎn)生懷疑,如果你要申請的是 Java J2EE方面的職位,你就等著人來問你Hibernate方面的面試問題吧。在JEE界,Spring和Hibernate是兩個最流行的Java框架。要是你被問到了其它也值得分享的Hibernate方面的面試問題, 別忘了在Java社區(qū)中同大家分享一下。
本文名稱:Hibernate的10個常見面試問題及答案
轉(zhuǎn)載來源:http://m.fisionsoft.com.cn/article/coeeoeg.html


咨詢
建站咨詢
