java面試常見問題之Hibernate總結(jié)
主要從以下十幾個(gè)方面對(duì)Hibernate做總結(jié),包括Hibernate的檢索方式,Hibernate中對(duì)象的狀態(tài),Hibernate的3種檢索策略是什么,分別適用于哪種場(chǎng)合,ORM解決的不匹配問題, Hibernate映射繼承關(guān)系的3種方式,Session的find()方法以及Query接口的區(qū)別等方面問題的總結(jié),具體內(nèi)容如下:
1 Hibernate的檢索方式
Ø 導(dǎo)航對(duì)象圖檢索(根據(jù)已經(jīng)加載的對(duì)象,導(dǎo)航到其他對(duì)象。)
Ø OID檢索(按照對(duì)象的OID來檢索對(duì)象。)
Ø HQL檢索(使用面向?qū)ο蟮腍QL查詢語言。)
Ø QBC檢索(使用QBC(Qurey By Criteria)API來檢索對(duì)象。 QBC/QBE離線/在線)
Ø 本地SQL檢索(使用本地?cái)?shù)據(jù)庫的SQL查詢語句。)
包括Hibernate的檢索方式,Hibernate中對(duì)象的狀態(tài),Hibernate的3種檢索策略是什么,分別適用于哪種場(chǎng)合,ORM解決的不匹配問題, Hibernate映射繼承關(guān)系的3種方式,Session的find()方法以及Query接口的區(qū)別等方面問題的總結(jié)
Ø 臨時(shí)狀態(tài)(transient):剛剛用new語句創(chuàng)建,還沒有被持久化,不處于Session的緩存中。處于臨時(shí)狀態(tài)的Java對(duì)象被稱為臨時(shí)對(duì)象。
Ø 持久化狀態(tài)(persistent):已經(jīng)被持久化,加入到Session的緩存中。處于持久化狀態(tài)的Java對(duì)象被稱為持久化對(duì)象。
Ø 游離狀態(tài)(detached):已經(jīng)被持久化,但不再處于Session的緩存中。處于游離狀態(tài)的Java對(duì)象被稱為游離對(duì)象。
3 Hibernate的3種檢索策略是什么,分別適用于哪種場(chǎng)合
Ø 立即檢索
優(yōu)點(diǎn):對(duì)應(yīng)用程序完全透明。
缺點(diǎn):select語句數(shù)目多。
適用:類級(jí)別。
Ø 延遲檢索
優(yōu)點(diǎn):由應(yīng)用程序決定加載哪些對(duì)象,可以避免執(zhí)行多余的select語句以及避免加載不需要訪問的對(duì)象,節(jié)省內(nèi)存空間,提高檢索效率。
缺點(diǎn):應(yīng)用程序如果要訪問游離態(tài)的代理類實(shí)例,必須保證它在持久化時(shí)已經(jīng)被初始化。
適用:一對(duì)多或多對(duì)多關(guān)聯(lián)。應(yīng)用程序不需要立即訪問或者根本不會(huì)訪問的對(duì)象。
Ø 迫切左外連接檢索
優(yōu)點(diǎn):對(duì)應(yīng)用程序完全透明,不管對(duì)象處于持久化狀態(tài)還是游離狀態(tài),應(yīng)用程序都可以方便的從一個(gè)對(duì)象導(dǎo)航到另一個(gè)與它相關(guān)聯(lián)的對(duì)象。使用了外連接,select語句數(shù)目少。
缺點(diǎn):可能會(huì)加載程序不許要訪問的對(duì)象。復(fù)雜的數(shù)據(jù)庫表連接形象檢索性能。
適用:一對(duì)一或多對(duì)一關(guān)聯(lián)。應(yīng)用程序需要立即訪問的對(duì)象。數(shù)據(jù)庫系統(tǒng)具有良好的表連接性能。
4 ORM解決的不匹配問題(域模型與關(guān)系模型之間存在的不匹配)
Ø 域模型是面向?qū)ο蟮?,關(guān)系模型是面向關(guān)系的。
Ø 域模型中有繼承關(guān)系,關(guān)系模型中不能直接表示繼承關(guān)系。
Ø 域模型中有多對(duì)多關(guān)聯(lián)關(guān)系,關(guān)系模型中通過連接表來表示多對(duì)多關(guān)聯(lián)關(guān)系。
Ø 域模型中有雙向關(guān)聯(lián)關(guān)系,關(guān)系模型中只有單向參照關(guān)系,而且總是many參照one方。
Ø 域模型提倡精粒度模型,關(guān)系模型提倡粗粒度模型。
5 Hibernate映射繼承關(guān)系的3種方式
Ø 整個(gè)的繼承體系就用一張表(tableper hierarchy)
Ø 每個(gè)子類一張表,存放子類所特有的屬性(tableper subclass)
Ø 每個(gè)具體類一張表(union-subclass),保存是子類完整信息(table per concrete )
6 Session的find()方法以及Query接口的區(qū)別
Session類的find()方法以及Query接口都支持HQL檢索方式。這兩者的區(qū)別在于,前者只是執(zhí)行一些簡單HQL查詢語句的便捷方法,它不具有動(dòng)態(tài)綁定參數(shù)的功能,而且在Hibernate3.x版本中,已經(jīng)淘汰了find()方法;而Query接口才是真正的HQL查詢接口,它提供了以上列出的各種查詢功能。
7 Hibernate關(guān)聯(lián)關(guān)系配置
Ø 一對(duì)一
Ø 一對(duì)多
Ø 多對(duì)多
8 簡述Session的特點(diǎn)
Ø 不是線程安全的,因此在設(shè)計(jì)軟件架構(gòu)時(shí),應(yīng)該避免多個(gè)線程共享同一個(gè)Session實(shí)例。
Ø Session實(shí)例是輕量級(jí)的,所謂輕量級(jí)是指它的創(chuàng)建和銷毀不需要消耗太多的資源。這意味著在程序中可以經(jīng)常創(chuàng)建或銷毀Session對(duì)象,例如為每個(gè)客戶請(qǐng)求分配單獨(dú)的Session實(shí)例,或者為每個(gè)工作單元分配單獨(dú)的Session實(shí)例。
Ø 在Session中,每個(gè)數(shù)據(jù)庫操作都是在一個(gè)事務(wù)(transaction)中進(jìn)行的,這樣就可以隔離開不同的操作(甚至包括只讀操作)。
9 Hibernate中采用XML文件來配置對(duì)象-關(guān)系映射的優(yōu)點(diǎn)
Hibernate既不會(huì)滲透到上層域模型中,也不會(huì)滲透到下層數(shù)據(jù)模型中。軟件開發(fā)人員可以獨(dú)立設(shè)計(jì)域模型,不必強(qiáng)迫遵守任何規(guī)范。數(shù)據(jù)庫設(shè)計(jì)人員可以獨(dú)立設(shè)計(jì)數(shù)據(jù)模型,不必強(qiáng)迫遵守任何規(guī)范。對(duì)象-關(guān)系映射不依賴于任何程序代碼,如果需要修改對(duì)象-關(guān)系映射,只需修改XML文件,不需要修改任何程序,提高了軟件的靈活性,并且使維護(hù)更加方便。
10 Session的緩存的作用
Ø 減少訪問數(shù)據(jù)庫的頻率。應(yīng)用程序從內(nèi)存中讀取持久化對(duì)象的速度顯然比到數(shù)據(jù)庫中查詢數(shù)據(jù)的速度快多了,因此Session的緩存可以提高數(shù)據(jù)訪問的性能。
Ø 保證緩存中的對(duì)象與數(shù)據(jù)庫中的相關(guān)記錄保持同步。當(dāng)緩存中持久化對(duì)象的狀態(tài)發(fā)生了變換,Session并不會(huì)立即執(zhí)行相關(guān)的SQL語句,這使得Session能夠把幾條相關(guān)的SQL語句合并為一條SQL語句,以便減少訪問數(shù)據(jù)庫的次數(shù),從而提高應(yīng)用程序的性能。
11 多事務(wù)并發(fā)運(yùn)行時(shí)的問題
Ø 第一類丟失更新
Ø 臟讀
Ø 虛讀/幻讀
Ø 不可重復(fù)讀
Ø 第二類丟失更新
12 session的清理和清空的區(qū)別
Ø session清理緩存是指按照緩存中對(duì)象的狀態(tài)的變化來同步更新數(shù)據(jù)庫;(Hibernate包含了三類session的Flush模式)
Ø 清空是session清除部分或全部對(duì)象或者session關(guān)閉;
13 Hibernate工作原理及為什么要用
Ø 原理
1.讀取并解析配置文件
2.讀取并解析映射信息,創(chuàng)建SessionFactory
3.打開Sesssion
4.創(chuàng)建事務(wù)Transation
5.持久化操作
6.提交事務(wù)
7.關(guān)閉Session
8.關(guān)閉SesstionFactory
Ø 為什么要用
1.對(duì)JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。
2.Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡化DAO層的編碼工作
3.hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。
4.hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫,從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
14 Hibernate延遲加載
1.Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對(duì)象 b) 集合類型(Collection)
2.Hibernate3 提供了屬性的延遲加載功能
當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。
15 Hibernate的緩存機(jī)制
1.一級(jí)緩存又叫內(nèi)部緩存存在Hibernate,屬于應(yīng)用事務(wù)級(jí)緩存
2.二級(jí)緩存
a) 應(yīng)用及緩存
b) 分布式緩存
條件:數(shù)據(jù)不會(huì)被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非關(guān)鍵數(shù)據(jù)。
c) 第三方緩存的實(shí)現(xiàn)
16 優(yōu)化Hibernate
1.使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多
2.靈活使用單向一對(duì)多關(guān)聯(lián)
3.不用一對(duì)一,用多對(duì)一取代
4.配置對(duì)象緩存,不使用集合緩存
5.一對(duì)多集合使用Bag,多對(duì)多集合使用Set
6.繼承類使用顯式多態(tài)
7.表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存撐腰
以上內(nèi)容是針對(duì)java面試比較常見的Hibernate總結(jié),希望能夠幫助到大家。
相關(guān)文章

Java中線程狀態(tài)+線程安全問題+synchronized的用法詳解

java實(shí)現(xiàn)基于TCP協(xié)議網(wǎng)絡(luò)socket編程(C/S通信)

java實(shí)現(xiàn)html轉(zhuǎn)pdf方法步驟