在Java J2EE方面進行面試時,常被問起的Hibernate面試問題,大多都是針對基於Web的企業級應用開發者的角色的。Hibernate框架在Java界的成功和高度的可接受性使得它成爲了Java技術棧中最受歡迎的對象關係影射(ORM)解決方案。Hibernate將你從數據庫相關的編碼中解脫了出來,使你能夠更加專一地利用強大的面向對象的設計原則來實現核心的業務邏輯。採用Hibernate後,你就可以至關容易地在不一樣的數據庫間進行切換,並且你還能夠利用Hibernate提供的開箱即用的二級緩存以及查詢緩存功能。你也知道,大部分Java面試中所提的問題不只僅會涉及Java的核心部分,並且還會涉及其它的Java框架,好比,根據項目的要求也有可能會問到Spring 框架方面的問題或者Struts方面的問題。若是你要參加的項目使用了Hibernate做爲ORM解決方案,你就應該同時準備好回答Spring和Hibernate這兩個框架方面的問題。好好看看JD或者職位說明,若是其中的任何地方出現了Hibernate這個詞,就要準備好怎樣來面對Hibernate方面的問題。 本文給出了一個Hibernate面試問題列表,這些都是我從朋友以及同事那裏蒐集來的。Hibernate 是一個很是流行的對象關係影射框架,熟悉Hibernate的優點所在以及Hibernate的Sesion API是搞定Hibernate面試之關鍵所在。 Hibernate中get和load有什麼不一樣之處? 把get和load放到一塊兒進行對比是Hibernate面試時最常問到的問題,這是由於只有正確理解get()和load()這兩者後纔有可能高效地使用Hibernate。get和load的最大區別是,若是在緩存中沒有找到相應的對象,get將會直接訪問數據庫並返回一個徹底初始化好的對象,而這個過程有可能會涉及到多個數據庫調用;而load方法在緩存中沒有發現對象的狀況下,只會返回一個代理對象,只有在對象getId()以外的其它方法被調用時纔會真正去訪問數據庫,這樣就能在某些狀況下大幅度提升性能。你也能夠參考 Hibernate中get和load的不一樣之處, 此連接給出了更多的不一樣之處並對該問題進行了更細緻的討論。 Hibernate中save、persist和saveOrUpdate這三個方法的不一樣之處? 除了get和load,這又是另一個常常出現的Hibernate面試問題。 全部這三個方法,也就是save()、saveOrUpdate()和persist()都是用於將對象保存到數據庫中的方法,但其中有些細微的差異。例如,save()只能INSERT記錄,可是saveOrUpdate()能夠進行 記錄的INSERT和UPDATE。還有,save()的返回值是一個Serializable對象,而persist()方法返回值爲void。你還能夠訪問 save、persist以及saveOrUpdate,找到它們全部的不一樣之處。 Hibernate中的命名SQL查詢指的是什麼? Hibernate的這個面試問題同Hibernate提供的查詢功能相關。命名查詢指的是用<sql-query>標籤在影射文檔中定義的SQL查詢,能夠經過使用Session.getNamedQuery()方法對它進行調用。命名查詢使你可使用你所指定的一個名字拿到某個特定的查詢。 Hibernate中的命名查詢可使用註解來定義,也可使用我前面提到的xml影射問句來定義。在Hibernate中,@NameQuery用來定義單個的命名查詢,@NameQueries用來定義多個命名查詢。 Hibernate中的SessionFactory有什麼做用? SessionFactory是線程安全的嗎? 這也是Hibernate框架的常見面試問題。顧名思義,SessionFactory就是一個用於建立Hibernate的Session對象的工廠。SessionFactory一般是在應用啓動時建立好的,應用程序中的代碼用它來得到Session對象。做爲一個單個的數據存儲,它也是 線程安全的,因此多個線程可同時使用同一個SessionFactory。Java JEE應用通常只有一個SessionFactory,服務於客戶請求的各線程都經過這個工廠來得到Hibernate的Session實例,這也是爲何SessionFactory接口的實現必須是線程安全的緣由。還有,SessionFactory的內部狀態包含着同對象關係影射有關的全部元數據,它是 不可變的,一旦建立好後就不能對其進行修改了。 Hibernate中的Session指的是什麼? 能否將單個的Session在多個線程間進行共享? 前面的問題問完以後,一般就會接着再問這兩個問題。問完SessionFactory的問題後就該輪到Session了。Session表明着Hibernate所作的一小部分工做,它負責維護者同數據庫的連接並且 不是線程安全的,也就是說,Hibernage中的Session不能在多個線程間進行共享。雖然Session會以主動滯後的方式得到數據庫鏈接,可是Session最好仍是在用完以後當即將其關閉。 hibernate中sorted collection和ordered collection有什麼不一樣? T這個是你會碰到的全部Hibernate面試問題中比較容易的問題。sorted collection是經過使用 Java的Comparator在內存中進行排序的,ordered collection中的排序用的是數據庫的order by子句。對於比較大的數據集,爲了不在內存中對它們進行排序而出現 Java中的OutOfMemoryError,最好使用ordered collection。 Hibernate中transient、persistent、detached對象三者之間有什麼區別? 在Hibernate中,對象具備三種狀態:transient、persistent和detached。同Hibernate的session有關聯的對象是persistent對象。對這種對象進行的全部修改都會按照事先設定的刷新策略,反映到數據庫之中,也即,能夠在對象的任何一個屬性發生改變時自動刷新,也能夠經過調用Session.flush()方法顯式地進行刷新。若是一個對象原來同Session有關聯關係,但當下卻沒有關聯關係了,這樣的對象就是detached的對象。你能夠經過調用任意一個session的update()或者saveOrUpdate()方法,從新將該detached對象同相應的seesion創建關聯關係。Transient對象指的是新建的持久化類的實例,它還從未同Hibernate的任何Session有過關聯關係。一樣的,你能夠調用persist()或者save()方法,將transient對象變成persistent對象。可要記住,這裏所說的transient指的可不是 Java中的transient關鍵字,兩者風馬牛不相及。 Hibernate中Session的lock()方法有什麼做用? 這是一個比較棘手的Hibernate面試問題,由於Session的lock()方法重建了關聯關係卻並無同數據庫進行同步和更新。所以,你在使用lock()方法時必定要多加當心。順便說一下,在進行關聯關係重建時,你能夠隨時使用Session的update()方法同數據庫進行同步。有時這個問題也能夠這麼來問:Session的lock()方法和update()方法之間有什麼區別?。這個小節中的關鍵點也能夠拿來回答這個問題。 Hibernate中二級緩存指的是什麼? 這是同Hibernate的緩存機制相關的第一個面試問題,不出意外後面還會有更多這方面的問題。二級緩存是在SessionFactory這個級別維護的緩存,它可以經過節省幾番數據庫調用往返來提升性能。還有一點值得注意,二級緩存是針對整個應用而不是某個特定的session的。 Hibernate中的查詢緩存指的是什麼? 這個問題有時是做爲上個Hibernate面試問題的後繼問題提出的。查詢緩存實際上保存的是sql查詢的結果,這樣再進行相同的sql查詢就能夠之間從緩存中拿到結果了。爲了改善性能,查詢緩存能夠同二級緩存一塊兒來使用。Hibernate支持用多種不一樣的開源緩存方案,好比EhCache,來實現查詢緩存。 爲何在Hibernate的實體類中要提供一個無參數的構造器這一點很是重要? 每一個Hibernate實體類必須包含一個 無參數的構造器, 這是由於Hibernate框架要使用Reflection API,經過調用Class.newInstance()來建立這些實體類的實例。若是在實體類中找不到無參數的構造器,這個方法就會拋出一個InstantiationException異常。 可不能夠將Hibernate的實體類定義爲final類? 是的,你能夠將Hibernate的實體類定義爲final類,但這種作法並很差。由於Hibernate會使用代理模式在延遲關聯的狀況下提升性能,若是你把實體類定義成final類以後,由於 Java不容許對final類進行擴展,因此Hibernate就沒法再使用代理了,如此一來就限制了使用能夠提高性能的手段。不過,若是你的持久化類實現了一個接口並且在該接口中聲明瞭全部定義於實體類中的全部public的方法輪到話,你就可以避免出現前面所說的不利後果。 Java開發者的Hibernate面試問答列表就到此爲止了。沒人會對Hibernate做爲ORM解決方案的受歡迎程度產生懷疑,若是你要申請的是Java J2EE方面的職位,你就等着人來問你Hibernate方面的面試問題吧。在JEE界,Spring和Hibernate是兩個最流行的Java框架。要是你被問到了其它也值得分享的Hibernate方面的面試問題, 別忘了在Java社區中同你們分享一下。