Hibernate 面試官必須出的面試題
1. 前言
本節(jié)課先和大家聊聊面試過程中需要注意的事項,再和大家一起講解 Hibernate 中常見的面試題。
2. 面試技巧
面試官出的面試題一般會有 3 個特點:
- 強(qiáng)調(diào)原理性: 通過面試者對問題原理性的講解,可以了解面試者是否真正理解、掌握了相關(guān)知識。對于知識而言,用是一個層次,說出來又是一個層次;
- 強(qiáng)調(diào)基礎(chǔ)性: 基礎(chǔ)的知識才是永恒的,任何高級的運(yùn)用都是建立在基礎(chǔ)知識之上,通過對基礎(chǔ)知識的提問可以了解面試者認(rèn)知的深淺。是浮于表面,還是扎根源頭;
- 講究細(xì)節(jié): 很多學(xué)生學(xué)完后,自我感覺非常好,但是面試題一般都會問到一些學(xué)習(xí)過程易忽視的細(xì)節(jié)內(nèi)容。
面試者解答時,需要掌握 3 個技巧:
- 要有專業(yè)性: 同一道題目,正確答案只有一個,若干面試者中,為什么面試官選擇了他而沒有選擇你。一個可能性就是答案不專業(yè),沒有切到中心點;
有很多面試者,面試完后,自我感覺回答的很好,但沒有接到再面試的通知。
有一方面原因是回答的不專業(yè)。
-
要有自己的見解: 有的人不是在回答問題,而是在向面試官背答案。答案沒有錯,如果缺少自己的獨(dú)有理解,如果同時有一個面試者除了給出專業(yè)的答案,還附有自己的理解。如果你是面試官,請問你會選擇誰;
-
要有層次性: 或者說是條理性、邏輯性,答案要有條理。1、2、3 結(jié)構(gòu)明顯,脈絡(luò)清晰。最忌諱雜亂不清。
面試心態(tài),當(dāng)大家實力相當(dāng)時,心態(tài)就有可能成為決定結(jié)果的有利因素:
- 不著急,不恐慌;
- 相信自己;
- 我是來找工作的,我是來找一家值得自己付出的公司,在面試一家能展現(xiàn)自己價值的公司。如果沒有被錄用,說明還有不足或者說明暫時沒有達(dá)到這家公司的要求;
- 學(xué)會放下,有重新再來的勇氣。
3. 常見面試題
- 簡述 Hibernate 的工作流程?
Hibernate 的主要功能是為原生 JDBC 開發(fā)提供 2 個自動化操作:構(gòu)建 SQL 語句和自動封裝數(shù)據(jù);
- 使用 Hibernate 時,首先需要通過其 Configuration 組件讀取連接數(shù)據(jù)庫的信息;
- 使用 Hibernate 的 SessionFactory 組件完成和數(shù)據(jù)庫系統(tǒng)的對接;
- 使用 Hibernate 提供的 Session 組件完成相關(guān)的數(shù)據(jù)操作;
- 使用 Hibernate 提供的 Transaction 組件完成事務(wù)管理;
- 關(guān)閉 Session,釋放資源。
- 簡述 Hibernate 的 get 和 load 方法區(qū)別?
get()方法直接構(gòu)建 SQL 語句,訪問數(shù)據(jù)庫,獲得數(shù)據(jù)。如果沒有獲取數(shù)據(jù),會返回一個 null。load()方法會生成一個代理對象,只有當(dāng)調(diào)用 get()方法時,才會訪問數(shù)據(jù)。如果數(shù)據(jù)庫中沒有數(shù)據(jù),則拋出一個 ObjectNotFountdException 異常。
- 簡述 Hibernate 持久化對象的 3 種狀態(tài)?
在程序級別初次構(gòu)建持久化對象時,此時數(shù)據(jù)庫中沒有此對象,則可說明此時持久化對象的狀態(tài)為瞬時或臨時狀態(tài)。
持久化對象經(jīng)過 Session 組件進(jìn)行對應(yīng)的操作后,如 get()、load()、save()等操作后,此時,此持久化對象數(shù)據(jù)在程序和數(shù)據(jù)庫中都存在,此時的持久化對象處于持久化狀態(tài)。
當(dāng) Session 組件關(guān)閉后,雖然此對象的數(shù)據(jù)在程序和數(shù)據(jù)庫都存在,但已經(jīng)失去了 Session 對象的管理,則說,則時此對象的狀態(tài)為脫離狀態(tài)。
- 簡述 Hibernate 的緩存機(jī)制?
使用緩存的目的是為了減少對數(shù)據(jù)庫的訪問次數(shù),提升 Hibernate 的操作效率;Hibernate 提供有 2 級緩存。一級緩存也叫做 Session 的緩存,提供 session 生命周期內(nèi)的數(shù)據(jù)緩存操作。當(dāng)調(diào)用 Session 的 save/saveOrUpdate/get/load/list/iterator 等方法的時候,都會把對象放入 Session 緩存中;
因為 Session 生命周期較短,所以,Session 緩存應(yīng)用價值并不很大。
Session 提供有與緩存管理有關(guān)的方法:
- session.flush(): 讓一級緩存與數(shù)據(jù)庫同步;
- session.evict ():清空一級緩存中指定的對象;
- session.clear():清空一級緩存中所有的對象。
二級緩存也叫 SessionFactory 緩存, SessionFactory 具有應(yīng)用程序級別的生命周期,具有實際意義 ,默認(rèn)情況下并沒有啟動,需要在主配置文件中做相關(guān)設(shè)置后再啟動。
一般被緩存的數(shù)據(jù)有如下幾個特點:
- 很少被修改的數(shù)據(jù);
- 不會被并發(fā)訪問的數(shù)據(jù);
- 經(jīng)常需要訪問的數(shù)據(jù);
- 不會被第三方修改的數(shù)據(jù)。
- 簡述 Hibernate 中 getCurrentSession 和 openSession 方法區(qū)別?
這 2 個方法都能得到 Session 對象。getCurrentSession 方法本質(zhì)上還是通過 openSession 返回 Session 對象,區(qū)別在于 getCurrentSession 會根據(jù)開發(fā)者在 Hibernate 主配置文件中的相關(guān)配置,延長其在特定事務(wù)期間的生命周期。
- 簡述 Hibernate 的樂觀鎖和悲觀鎖?
樂觀鎖和悲觀鎖都是并發(fā)策略,更好的保證并發(fā)過程中事務(wù)之間的隔離性。
樂觀鎖:
優(yōu)勢:性能好,并發(fā)性高。
缺點:用戶體驗不好,可能會出現(xiàn)高高興興去更新,卻告知已經(jīng)有人捷足先登了。
悲觀鎖:
優(yōu)勢:鎖住記錄為我所用,沒修改完成之前,其他事務(wù)只能瞪眼瞧著,時間雖然延遲,至少心里有底。
缺點:并發(fā)性不好,性能不高。
- 簡述 Hibernate 的延遲加載機(jī)制?
延遲加載是 Hibernate 提供的一種性能優(yōu)化方案,但是,使用時需要注意,必須保持在 Session 生命周期之內(nèi)。
Hibernate 中的延遲加載有 2 種情形:
- 如 load()方法。直接調(diào)用 load()方法只會產(chǎn)生一個代理對象,只有當(dāng)訪問屬性的 get()方法時,才會訪問數(shù)據(jù)。
- one-to-many、many-to-one、many-to-many 中也可以設(shè)置延遲加載,只有訪問與當(dāng)前查詢相關(guān)的關(guān)系表中的數(shù)據(jù)時,才會進(jìn)行數(shù)據(jù)加載。
因為 Session 生命周期較短,如果要跨組件使用延遲加載功能, 則需保持 Session 生命周期與請求過程相同。WEB 項目開發(fā)中,Hibernate 提供的有 OpenSessionInViewFilter 過濾器,用來保證請求開始和響應(yīng)結(jié)束的時候,使用同一個 Session。請求開始創(chuàng)建 Session,響應(yīng)結(jié)束關(guān)閉 Session。
4. 小結(jié)
好了,本節(jié)課和大家聊聊了面試中需要注意的問題,以及一些較常見的面試題目。要記住,你再怎么刷題都是不可能刷完所有的題目,唯有掌握其內(nèi)在原理,以不變應(yīng)萬變才是上上之策。