Hibernate常見面試題

不管多複雜,hibernate終究是一個和數據庫打交道的框架,與jdbc功能同樣。因此沒有理由畏懼hibernate. hibernate的難點我以爲有兩方面:一是性能優化,二是session管理。性能優化是個經驗活; 關於session管理,單純的hibernate可使用ThreadLocal來解決, 若是和spring結合,使用spring提供的session管理方案很不錯。
hibernate常見面試題:
---------------------------------------------------
http://topic.csdn.net/u/20081207/22/6d6b75f8-3988-484c-ab4f-f388869b2f00.html
http://lpcjrflsa.javaeye.com/blog/325932
Hibernate工做原理及爲何要用? 
原理: 
1.讀取並解析配置文件 
2.讀取並解析映射信息,建立SessionFactory 
3.打開Sesssion 
4.建立事務Transation 
5.持久化操做 
6.提交事務 
7.關閉Session 
8.關閉SesstionFactoryhtml

爲何要用: 
.對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。 
.Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做 
.hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。 
.hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。java

2.Hibernate是如何延遲加載? 
. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection) 
. Hibernate3 提供了屬性的延遲加載功能 
當Hibernate在查詢數據的時候,數據並無存在與內存中,當程序真正對數據的操做時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而面試

提升了服務器的性能。spring

3.Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係) 
類與類之間的關係主要體如今表與表之間的關係進行操做,它們都市對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們經過配置文件中的many-to-one、數據庫

one-to-many、many-to-many、緩存

4. 說下Hibernate的緩存機制 
. 內部緩存存在Hibernate中又叫一級緩存,屬於應用事物級緩存 
. 二級緩存: 
a) 應用及緩存 
b) 分佈式緩存 
條件:數據不會被第三方修改、數據大小在可接受範圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據 
c) 第三方緩存的實現性能優化

5. Hibernate的查詢方式 
Session.get Session.load
Sql、Criteria,object comptosition 
Hql: 
一、 屬性查詢 
二、 參數查詢、命名參數查詢 
三、 關聯查詢 
四、 分頁查詢 
五、 統計函數服務器

6. 如何優化Hibernate? 
.使用雙向一對多關聯,不使用單向一對多 
.靈活使用單向一對多關聯 
.不用一對一,用多對一取代 
.配置對象緩存,不使用集合緩存 
.一對多集合使用Bag,多對多集合使用Set 
.繼承類使用顯式多態 
.表字段要少,表關聯不要怕多,有二級緩存撐腰session

7. get和load區別;
1)get若是沒有找到會返回null, load若是沒有找到會拋出異常。框架

2)get會先查一級緩存, 再查二級緩存,而後查數據庫;load會先查一級緩存,若是沒有找到,就建立代理對象, 等須要的時候去查詢二級緩存和數據庫。

8. N+1問題。

Hibernate中常會用到set,bag等集合表示1對多的關係, 在獲取實體的時候就能根據關係將關聯的對象或者對象集取出。

解決方法一個是延遲加載, 即lazy=true;

一個是預先抓取, 即fetch=join;

9. inverse的好處。

在關聯關係中用inverse在控制由哪一端來控制關聯關係。這樣作有什麼好處呢?舉customer和order的例子來講。他們是一對多的關係,若是隻單向關聯,且由customer控制關聯關係,則若是我想添加一個order,則先取customer, 而後getOrders獲得全部的order集合,而後往集合裏面多加入一個order,而後save(customer), 這樣開銷太大。 若是改雙向關聯且由order主控關係,則若是想爲customer增長一個order, 則new一個order,而後給order設置customer,而後save(order)便可。

 10 merge的含義:
http://cp3.iteye.com/blog/786019 這裏寫的好;
若是session中存在相同持久化標識(identifier)的實例,用用戶給出的對象的狀態覆蓋舊有的持久實例
若是session沒有相應的持久實例,則嘗試從數據庫中加載,或建立新的持久化實例
最後返回該持久實例
用戶給出的這個對象沒有被關聯到session上,它依舊是脫管的 

11 persist和save的區別
persist不保證當即執行,可能要等到flush;persist不更新緩存;

12 cascade,用來指示在主對象和它包含的集合對象的級聯操做行爲,即對住對象的更新怎麼影響到子對象;
save-update:   級聯保存(load之後若是子對象發生了更新,也會級聯更新). 但它不會級聯刪除
delete:              級聯刪除, 但不具有級聯保存和更新
all-delete-orphan: 在解除父子關係時,自動刪除不屬於父對象的子對象, 也支持級聯刪除和級聯保存更新.
all:                    級聯刪除, 級聯更新,但解除父子關係時不會自動刪除子對象. 
delete-orphan:刪除全部和當前對象解除關聯關係的對象

13 session.commit 和flush區別, commit會先調用flash執行session清理,而後提交事物; flash執行session,但不必定提交事物(由於事物可能被委託給外圍的aop代理來作);

14 session清理的順序: insert -> update -> delete -> 對集合進行delete -〉對集合的insert;

15 檢索策略: 當即檢索,lazy=false;延遲加載:lazy=true;預先抓取: fetch=「join」;

16 主鍵生成 策略有哪些?identity,increment, sequence, assigned, uuid.hex, foreign; foreign是一對一主鍵關聯的狀況下使用。

相關文章
相關標籤/搜索