面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

今天和大家一起分享一下關於hibernate的一些經典面試題

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

一、hibernate 中物件的三種狀態

瞬時態(臨時態、自由態):不存在持久化標識OID,尚未與 Hibernate Session 關聯物件, 被認為處於瞬時態,

失去引用將被 JVM 回收

持久態:存在持久化標識 OID,與當前 session 有關聯,並且相關聯的 session 沒有關閉 , 並且事務未提交

脫管態(離線態、遊離態):存在持久化標識 OID,但沒有與當前 session 關聯,脫管狀態 改變 hibernate 不能檢測到

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

二、hibernate 的快取機制

Hibernate 快取分為兩層:Hibernate 的一級快取和 Hibernate 二級快取。

1。Hibernate 一級快取(Session 的快取):

(1)Session 實現了第一級 Cache,屬於事務級資料緩衝。一旦事務結束,快取隨之失效。一個 Session 的生命週期對應一個數據庫事務或一個程式事務。

(2)Session-Cache 總是被開啟並且不能被關閉的。

(3)Session-Cache 保證一個 Session 中兩次請求同一個物件時,取得的物件是同一個 Java 例項,有時它可以避免不必要的資料衝突。

a。在對於同一個物件進行迴圈引用時,不至於產生堆疊溢位。

b。當資料庫事務結束時,對於同一資料錶行,不會產生資料衝突。因為對於資料庫中的一行,最多有一個物件來表示它。

c。一個事務中可能會有很多個處理單元,在每一個處理單元中做的操作都會立即被其他的資料單元得知。

2。Hibernate 二級快取(SessionFactory 的快取):

1)二級快取是 SessionFactory 範圍內的快取,所有的 Session 共享同一個二級快取。在二級快取中儲存持久化例項的散裝形式的資料。

(2)持久化不同的資料需要不同的 Cache 策略,比如一些因素將影響 Cache 策略的選擇:資料的讀/寫比例、資料表是否能被其他的應用程式所訪問等。

(3)設定 Hibernate 二級快取需要分兩步:首先,確認使用什麼資料併發策略。然後,配置快取過期時間並設定 Cache提供器。

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

三、Hibernate 的查詢方式有哪些?

Hibernate 的查詢方式常見的主要分為三種: HQL, QBC(命名查詢), 以及使用原生 SQL 查詢(SqlQuery)

四、 Hibernate 和 Mybatis 的區別?

兩者相同點:

1)Hibernate 與 MyBatis 都可以是透過 SessionFactoryBuider 由 XML 配置檔案生成 SessionFactory,然後由

SessionFactory 生成 Session,最後由 Session 來開啟執行事務和 SQL 語句。其中 SessionFactoryBuider,

SessionFactory,Session 的生命週期都是差不多的。

2)Hibernate 和 MyBatis 都支援 JDBC 和 JTA 事務處理。

Mybatis 優勢:

1)MyBatis 可以進行更為細緻的 SQL 最佳化,可以減少查詢欄位。

2)MyBatis 容易掌握,而 Hibernate 門檻較高。

Hibernate 優勢:

1)Hibernate 的 DAO 層開發比 MyBatis 簡單,Mybatis 需要維護 SQL 和結果對映。

2)Hibernate 對物件的維護和快取要比 MyBatis 好,對增刪改查的物件的維護要方便。

3)Hibernate 資料庫移植性很好,MyBatis 的資料庫移植性不好,不同的資料庫需要寫不同 SQL。

4)Hibernate 有更好的二級快取機制,可以使用第三方快取。MyBatis 本身提供的快取機制不佳。

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

五、Hibernate 和 JDBC 優缺點對比

相同點:

1)兩者都是 java 資料庫操作的中介軟體、

2)兩者對資料庫進行直接操作的物件都是執行緒不安全的,都需要及時關閉。

3)兩者都可對資料庫的更新操作進行顯式的事務處理。

不同點:

JDBC 是 SUN 公司提供一套操作資料庫的規範,使用 java 程式碼操作資料庫。Hibernate 是一個基於 jdbc 的主流持久化框架,對 JDBC 訪問資料庫的程式碼做了封裝。

使用的 SQL 語言不同:JDBC 使用的是基於關係型資料庫的標準 SQL 語言,Hibernate 使用的是 HQL(Hibernatequery language)語言。

操作的物件不同:JDBC 操作的是資料,將資料透過 SQL 語句直接傳送到資料庫中執行,Hibernate 操作的是持久化物件,由底層持久化物件的資料更新到資料庫中。

資料狀態不同:JDBC 操作的資料是“瞬時”的,變數的值無法與資料庫中的值保持一致,而 Hibernate 操作的資料是可持久的,即持久化物件的資料屬性的值是可以跟資料庫中的值保持一致的。

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

六、關於 Hibernate 的 orm 思想你瞭解多少?

ORM 指的是物件關係型對映(Object RelationShip Mapping ),指的就是我們透過建立實體類物件和資料庫中的表關係進行一一對應,來實現透過操作實體類物件來更改資料庫裡邊的資料資訊。這裡邊起到關鍵作用的是透過Hibernate 的對映檔案+Hibernate 的核心配置檔案。

七、get 和 load 的區別?

(1)get 是立即載入,load 是延時載入。

(2)get 會先查一級快取,再查二級快取,然後查資料庫;load 會先查一級快取,如果沒有找到,就建立代理物件,等需要的時候去查詢二級快取和資料庫。(這裡就體現 load 的延遲載入的特性。)

(3)get 如果沒有找到會返回 null,load 如果沒有找到會丟擲異常。

(4)當我們使用 session。load()方法來載入一個物件時,此時並不會發出 sql 語句,當前得到的這個物件其實是一個代理物件,這個代理物件只儲存了實體物件的 id 值,只有當我們要使用這個物件,得到其它屬性時,這個時候才會發出 sql 語句,從資料庫中去查詢我們的物件;相對於 load 的延遲載入方式,get 就直接的多,當我們使用session。get()方法來得到一個物件時,不管我們使不使用這個物件,此時都會發出 sql 語句去從資料庫中查詢出來。

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

八、如何進行 Hibernate 的最佳化?

(1)資料庫設計調整。

(2)HQL 最佳化。

(3)API 的正確使用(如根據不同的業務型別選用不同的集合及查詢 API)。

(4)主配置引數(日誌,查詢快取,fetch_size, batch_size 等)。

(5)對映檔案最佳化(ID 生成策略,二級快取,延遲載入,關聯最佳化)。

(6)一級快取的管理。

(7)針對二級快取,還有許多特有的策略。

(8)事務控制策略。

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

九、什麼是 Hibernate 延遲載入?

延遲載入機制是為了避免一些無謂的效能開銷而提出來的,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。在 Hibernate 中提供了對實體物件的延遲載入以及對集合的延遲載入,另外在 Hibernate3 中還提供了對屬性的延遲載入。

延遲載入的過程:透過代理(Proxy)機制來實現延遲載入。Hibernate 從資料庫獲取某一個物件資料時、獲取某一個物件的集合屬性值時,或獲取某一個物件所關聯的另一個物件時,由於沒有使用該物件的資料(除識別符號外),

Hibernate 並不從資料庫載入真正的資料,而只是為該物件建立一個代理物件來代表這個物件,這個物件上的所有屬性都為預設值;只有在真正需要使用該物件的資料時才建立這個真正的物件,真正從資料庫中載入它的資料。

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

十、No Session 問題原理及解決方法?

Nosession 問題報錯如下:

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

根據字面上的意思,是指代理不能被初始化,session 已經關閉。

Nosession 問題產生的原因:

當執行 Session 的 load()方法時,Hibernate 不會立即執行查詢所查詢物件關聯的物件(在此我們統稱被關聯的物件類為 A 類),僅僅返回 A 類的代理類的例項,這個代理類具由以下特徵:

(1)由 Hibernate 在執行時動態生成,它擴充套件了 A 類,因此它繼承了 A 類的所有屬性和方法,但它的實現對於應用程式是透明的。

(2)當 Hibernate 建立 A 類代理類例項時,僅僅初始化了它的 OID 屬性,其他屬性都為 null,因此這個代理類例項佔用的記憶體很少。

(3)當應用程式第一次訪問 A 代理類例項時(例如呼叫 a。。getXXX()或 a。setXXX()方法),Hibernate 會初始化代理類例項,在初始化過程中執行 select 語句,真正從資料庫中載入 A 物件的所有資料。但有個例外,那就是當應用程式訪問 A 代理類例項的 getId()方法時,Hibernate 不會初始化代理類例項,因為在建立代理類例項時 OID 就存在了,不必到資料庫中去查詢。

提示:Hibernate 採用 CGLIB 工具來生成持久化類的代理類。CGLIB 是一個功能強大的 Java 位元組碼生成工具,

它能夠在程式執行時動態生成擴充套件 Java 類或者實現 Java 介面的代理類。

因為 Hibernate 中如果採用 load 載入的話(預設的是延遲載入),也就是 lazy=true 操作,因此,當呼叫完 load後,session 即可關閉。因為我們的 session 只是放置到了 Dao 層,表現層根本獲取不到,所以在表現層呼叫的時候,session 已經關閉,報錯。

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

十一、比較 Hibernate 三種檢索策略的優缺點

1、立即檢索

優點:對應用程式完全透明,不管物件處於持久化狀態,還是遊離狀態,應用程式都可以方便的從一個物件導航到與它關聯的物件;

缺點:1。select 語句太多;2。可能會載入應用程式不需要訪問的物件白白浪費許多記憶體空間;

2、延遲檢索

優點:由應用程式決定需要載入哪些物件,可以避免可執行多餘的 select 語句,以及避免載入應用程式不需要訪問的物件。因此能提高檢索效能,並且能節省記憶體空間;

缺點:應用程式如果希望訪問遊離狀態代理類例項,必須保證他在持久化狀態時已經被初始化;

3、 迫切左外連線檢索

優點:1、對應用程式完全透明,不管物件處於持久化狀態,還是遊離狀態,應用程式都可以方便地衝一個物件導航到與它關聯的物件。2、使用了外連線,select 語句數目少;

缺點:1、可能會載入應用程式不需要訪問的物件,白白浪費許多記憶體空間;2、複雜的資料庫表連線也會影響檢索效能;

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

十二、簡述一下 hibernate 的開發流程

第一步:載入 hibernate 的配置檔案,讀取配置檔案的引數(jdbc 連線引數,資料 庫方言,hbm 表與物件關係對映檔案)

第二步:建立 SessionFactory 會話工廠(內部有連線池)

第三步:開啟 session 獲取連線,構造 session 物件(一次會話維持一個數據連線, 也是一級快取)

第四步:開啟事務

第五步:進行操作

第六步:提交事務

第七步:關閉 session(會話)將連線釋放

第八步:關閉連線池

面試官經常喜歡問的Hibernate經典面試題,值得好好收藏哦!

好了,今天就和大家分享到這裡咯!再見