當前位置:學問谷 >

職場範例 >面試 >

hibernate面試題彙總

hibernate面試題彙總

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的問題!

  • 文章版權屬於文章作者所有,轉載請註明 https://xuewengu.com/zh-hk/flzc/mianshi/14p132.html