不管多複雜,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是一對一主鍵關聯的狀況下使用。