1. 程式人生 > >Hibernate的10個常見面試問題及答案

Hibernate的10個常見面試問題及答案

在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面試之關鍵所在。

1.Hibernate中get和load有什麼不同之處? 

get和load的最大區別是,如果在快取中沒有找到相應的物件,get將會直接訪問資料庫並返回一個完全初始化好的物件,而這個過程有可能會涉及到多個數據庫呼叫;而load方法在快取中沒有發現物件的情況下,只會返回一個代理物件,只有在物件getId()之外的其它方法被呼叫時才會真正去訪問資料庫,這樣就能在某些情況下大幅度提高效能。你也可以參考 Hibernate中get和load的不同之處, 此連結給出了更多的不同之處並對該問題進行了更細緻的討論。

2.Hibernate中save、persist和saveOrUpdate這三個方法的不同之處? 

所有這三個方法,也就是save()、saveOrUpdate()和persist()都是用於將物件儲存到資料庫中的方法,但其中有些細微的差別。例如,save()只能INSERT記錄,但是saveOrUpdate()可以進行 

記錄的INSERT和UPDATE。還有,save()的返回值是一個Serializable物件,而persist()方法返回值為void。你還可以訪問 save、persist以及saveOrUpdate,找到它們所有的不同之處。

3.可不可以將Hibernate的實體類定義為final類?

是的,你可以將Hibernate的實體類定義為final類,但這種做法並不好。因為Hibernate會使用代理模式在延遲關聯的情況下提高效能,如果你把實體類定義成final類之後,因為 Java不允許對final類進行擴充套件,所以Hibernate就無法再使用代理了,如此一來就限制了使用可以提升效能的手段。不過,如果你的持久化類實現了一個介面而且在該介面中聲明瞭所有定義於實體類中的所有public的方法輪到話,你就能夠避免出現前面所說的不利後果。

4.Hibernate中的命名SQL查詢指的是什麼? 

這個面試問題同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 的 10 常見面試問題答案

原文出處: 開源中國 在Java J2EE方面進行面試時,常被問起的Hibernate面試問題,大多都是針對基於Web的企業級應用開發者的角色的。Hibernate框架在Java界的成功和高度的可接受性使得它成為了Java技術棧中最受歡迎的物件關係影射(ORM)解決方案。

Hibernate的10常見面試問題答案

在Java J2EE方面進行面試時,常被問起的Hibernate面試問題,大多都是針對基於Web的企業級應用開發者的角色的。Hibernate框架在Java界的成功和高度的可接受性使得它成為了Java技術棧中最受歡迎的物件關係影射(ORM)解決方案。Hibernate將你從

java面試中可能常問的幾技術問題答案

string和stringBuffer的區別; a.      常量和變數的區別,string雖然可以在後面增加其他字串,但是增加後就成了另一個物件,所以是個常量,stringBuffer字串改變後; b.     當字串需要經常改變的時候,一般用StringBuffer,

html5面試常見問題答案:架構篇

1、如果讓你來製作一個訪問量很高的大型網站,你會如何來管理所有css、js檔案、圖片?(1)遵循自定的一套CSS,JS和圖片檔案和資料夾命名規範(2)依託採用的前端工程化工具,依照工具腳手架規範 (gulp, webpack, grunt, yeoman)(3)依據採用的框架

RocketMQ在面試中那些常見問題答案+彙總

0、彙總 RocketMQ入門到入土(一)新手也能看懂的原理和實戰! RocketMQ入門到入土(二)事務訊息&順序訊息 從入門到入土(三)RocketMQ 怎麼保證的訊息不丟失? RocketMQ入門到入土(四)producer生產訊息原始碼剖析 RocketMQ入門到入土(五)訊息持久化儲存原始碼

java面試答案

值傳遞 span margin 線程與進程 線程狀態 內存 快排 需要 cookie 什麽是值傳遞和引用傳遞 值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本。改變副本當然不影響原變量。引用傳遞一般是對於對象型變量而言的。傳遞的是引用對象的內存地址 線程狀態

3年安卓經驗面試答案總彙(整理中。。。)

計算機基礎部分 1.一個位元組多少位儲存 一個位元組有8個位,每個位有2種狀態 1和0 於是呢 如果將首位作為符號位 即1為負數 0為整數 則 一位元組存的最小數為 11111111(-128) 最大數為 01111111(127) 如果沒有符號位則 最小數為00000000(十進位制0) 最大

計算機網路的五常見面試問題

1.TCP 三次握手和四次揮手的全過程 答:  三次握手: 第一次握手:客戶端傳送syn包(syn=x)到伺服器,並進入SYN_SEND狀態,等待伺服器確認; 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack

合併請求的 10 常見問題建議

我參加過很多 GitHub 託管的專案,不管是個人的、開源的還是合約的。有時候用免費的 GitHub,其他時候用 GitHub 企業版。但有一件事是一樣的:提交合並請求(Pull Request)很容易的,但審查好 PR 真的很難。 所以乾脆寫一篇合併請求的 10

安卓面試答案2

 什麼是 Activity? 通俗一點說 Activity 就是一個介面,這個介面裡面可以放置各種控制元件。Activity 的介面也是 用 xml 檔案表示的,放置在 res->layout 下面。每生成一個新的 Activity 後,我們需要在 AndroidManifest

和BEM的戰鬥:10常見問題如何避免

無論你是剛剛發現BEM或者已經是個中熟手(作為web術語來說),你可能已經意識到它是一種有用的方法。如果你還不知道BEM是什麼,我建議你在繼續閱讀這篇文章之前去BEM website瞭解一下它,因為我會假設你對這種CSS的方法有一個基礎的理解。 本文旨在對

Redis幾常見面試題目

1 什麼是redis?     Redis 是一個基於記憶體的高效能key-value資

面試常見的50面試題目答案

volatile unsigned int produceCount, consumeCount; TokenType buffer[BUFFER_SIZE]; void producer(void) {     while (1) {         while (produceCount - consu

25 最基本的 JavaScript 面試問題答案

tolower 包括 插入 mozilla ldr fis 為什麽 bin ger 1.使用 typeof bar === "object" 來確定 bar 是否是對象的潛在陷阱是什麽?如何避免這個陷阱? 盡管 typeof bar === "object" 是檢查

25最基本的JavaScript面試問題答案

list() foreach 函數塊 code 不存在 狀態 遞歸 例如 實現 1.使用 typeof bar === "object" 來確定 bar 是否是對象的潛在陷阱是什麽?如何避免這個陷阱? 盡管 typeof bar === "object" 是檢查 bar 是

面試必備,java常見基礎面試題答案整理!

大家好,今天為大家帶來了常見的面試題整理的分享。 1、面向物件的特徵有哪些方面 1.抽象: 抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是

Google招聘Linux工程師的20面試問題答案

1.如何檢視當前的Linux伺服器的執行級別? 答: ‘who -r’ 和 ‘runlevel’ 命令可以用來檢視當前的Linux伺服器的執行級別。 2.如何檢視Linux的預設閘道器? 答: 用 “route -n” 和 “netstat -nr” 命令,我們可以檢視預設閘道器。 除了預設的閘道

面試必備:30 Java 集合面試問題答案

Java集合框架為Java程式語言的基礎,也是Java面試中很重要的一個知識點。這裡列出了一些關於Java集合的重要問題和答案。 1.Java集合框架是什麼?說出一些集合框架的優點? 每種程式語言中都有集合,最初的Java版本包含幾種集合類:Vector、Stack、

面試必備,java常見基礎面試題答案

1、面向物件的特徵有哪些方面 1.抽象: 抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。 2.繼承: 繼承是一種聯結類的層次模

WEB前端面試常見的問題答案

一.html+css:在w3c的標準模式下,width=width,但是在怪異模式下,width=border*2+padding*2+width;其中後代元素的width:100%;二.html5新特