hibernate面試題彙總

來源:果殼範文吧 2.24W

1. 請解釋Hibernate3.2主鍵的生成方式中,native和identity方式的區別。

hibernate面試題彙總

Native主鍵生成方式會根據不同的底層資料庫自動選擇Identity、Sequence、Hilo主鍵生成方式

特點:根據不同的底層資料庫採用不同的主鍵生成方式。由於Hibernate會根據底層資料庫採用不同的對映方式,因此便於程式移植,專案中如果用到多個數據庫時,可以使用這種方式。

Identity根據底層資料庫,來支援自動增長,不同的資料庫用不同的主鍵增長方式。

特點:與底層資料庫有關,要求資料庫支援Identity,如

MySQl中是auto_increment,

SQL Server 中是Identity,支援的資料庫有MySql、SQL Server、DB2、Sybase和HypersonicSQL。

Identity無需Hibernate和使用者的干涉,使用較為方便,但不便於在不同的資料庫之間移植程式。

2. 請解釋為什麼SessionFactory一般以單利方式使用。

SessionFactory是一個大型物件,而且執行緒安全。在一個程式中只需要一個

3. 請解釋說明hibernate配置檔案中dialect屬性的確切含義。

資料庫方言:多種資料庫擁有不同的語言語法,通過設定dialect指定所用的資料庫,並生成對應語法和語言的sql語句。

4,請解釋說明Hibernate控制下的POJO<物件>會呈現三種狀態,分別是transient、persistenet和detached,請解釋這三種狀態。

暫態:資料庫中沒資料。跟session不相關。沒存過。

遊離態:在資料庫中有記錄,但是在session中沒有。需要手工同步。

持久態:資料庫中有記錄,session中也有這記錄。自動更新

5. 請解釋Session的load方法和get方法的不同;

load 在載入的時候會根據載入策略來載入東西,載入策略預設為延遲載入,即只加載id.,如果需要用其它資料,必須在session關閉之前,去載入某一 個屬性。lazy="true" or "false" 如果載入策略是立即載入,那麼它在載入時會把資料資訊全部載入,這個時候即使,關閉session,因為資料已經全部載入了,也能取得資料

get 會直接採用立即載入策略載入資料,不管你配置的是延遲載入還是立即載入

關於立即載入和延遲載入 不僅只對自己這張表,將來表與表之間有關係時,一樣會起作用。

如果物件不存在 get返回null load拋異常

6.請解釋cascade屬性和-orphan的區別。

: 在執行 時進行關聯操作。

all--orphan: 當一個節點在物件圖中成為孤兒節點時,刪除該節點。比如在一個一對多的關係中,Student包含多個book,當在物件關係中刪除一個book時,此book即成為孤兒節點。

7.請解釋inverse屬性的作用

inverse表“是否放棄維護關聯關係”(在Java裡兩個物件產生關聯時,對資料庫表的影響),在one-to-many和many-to-many的集合定義中使用,inverse="true"表示該物件不維護關聯關係;該屬性的值一般在使用有序集合時設定成false(注意hibernate的預設值是false)。 one-to-many維護關聯關係就是更新外來鍵。many-to-many維護關聯關係就是在中間表增減記錄。

8.請解釋Hibernate查詢中出現的N+1問題,並提出解決方案。

Hibernate在檢索與Customer關聯的Order物件時,使用了預設的立即檢索策略。這種檢索策略存在兩大不足:

(1) select語句的數目太多,需要頻繁的訪問資料庫,會影響檢索效能。如果需要查詢n個Customer物件,那麼必須執行n+1次select查詢語句。這就是經典的n+1次select查詢問題。

(2)在應用邏輯只需要訪問Customer物件,而不需要訪問Order物件的場合,載入Order物件完全是多餘的操作,這些多餘的Order物件白白浪費了許多記憶體空間。

為了解決以上問題,Hibernate提供了其他兩種檢索策略:延遲檢索策略和迫切左外連線檢索策略。延遲檢索策略能避免多餘載入應用程式不需要訪問的關聯物件,迫切左外連線檢索策略則充分利用了SQL的外連線查詢功能,能夠減少select語句的數目。

9.請簡要的描述一下使用Hibernate進行大批量更新的經驗;

直接使用hibernate API 進行批量更新和批量刪除都不推薦,而直接通過JDBC API執行相關的SQl語句或呼叫相關的儲存過程是最佳的方式。

10,請簡要的描述一下使用Hibernate二級快取記憶體的經驗

rnate3的二級快取和session級別的快取一樣都只對實體物件做快取,不對屬性級別的查詢做快取;二級快取的生命週期和sessionFactory的生命週期是一樣的,sessionFactory可以管理二級快取;

ionFactory級別的快取,需要手動配置;所有的session可以共享sessionFactory 級別的快取;(一般把一些不經常變化的實體物件放到sessionFactory級別的快取中,適合放不經常變化的實體物件。)

rante3二級快取的配置和使用方法如下:

必須把包匯入,然後到Hibernate3.2的etc檔案下把複製到工程src目錄下(裡邊的'引數裡邊有詳細英文說明);

說明:是第三方法的快取產品,hiberante只是把它做了整合,還有好多第三方hibernate整合的快取產品,相關說明請查閱hiberante3開發手冊;ehcache是不支援分佈應用的,如果有分散式需求,請換成支援分散式的二級快取產品,hiberate3開發手冊都有相頭說明。配置方法都類似);

rnate3的二級快取預設是開起的,也可以指定開起。

11,Query的list和iterator方法的不同。

list不會使用快取,而iterate會先取資料庫select id出來,然後一個id一個id的load,如果在快取裡面有,就從快取取,沒有的話就去資料庫load。

不管是list方法還是iterate方法,第一次查詢的時候,它們的查詢方式很它們平時的方式是一樣的,list執行一條sql,iterate執行1+N條,多出來的行為是它們填充了快取

查詢快取需要開啟相關類的class快取。list和iterate方法第一次執行的時候,都是既填充查詢快取又填充class快取的。

這裡還有一個很容易被忽視的重要問題,即開啟查詢快取以後,即使是list方法也可能遇到1+N的問題!

熱門標籤