- 相關(guān)推薦
hibernate面試題及答案
求職應(yīng)聘,面試技巧的準(zhǔn)備是必不可少的環(huán)節(jié)?靵(lái)學(xué)習(xí)hibernate面試題及答案啦,增加面試通過(guò)率,陽(yáng)光網(wǎng)小編帶你一起學(xué)習(xí)。
hibernate面試題及答案(一)
一. Hibernate工作使用步驟?
1. 讀取并解析配置文件
2. 讀取并解析映射信息,創(chuàng)建SessionFactory
3. 打開Sesssion
4. 創(chuàng)建事務(wù)Transation
5. 持久化操作
6. 提交事務(wù)
7. 關(guān)閉Session
8. 關(guān)閉SesstionFactory
二.Hibernate的查詢方式有幾種?
(1)導(dǎo)航對(duì)象圖檢索方式。根據(jù)已經(jīng)加載的對(duì)象,導(dǎo)航到其他對(duì)象。
(2)OID查詢方式。根據(jù)對(duì)象的OID來(lái)查詢對(duì)象。Session的get()和load()方法。
(3)HQL查詢方式。HQL是面向?qū)ο蟮牟樵冋Z(yǔ)言,session的find()方法用于執(zhí)行HQL查詢語(yǔ)句?梢岳肣uery接口。
Query query = session.createQuery(“from Customer as c where c.name =: customerName”);
query.setString(“customerName”,”張三”); List resultList = query.list();
(4)QBC查詢方式。這種API封裝了基于字符串形式的查詢語(yǔ)句。
Criteria criteria = session.createCriteria(User.class); Criterion criterion1 = Expession.like(“name”,”T%”);
Criterion criterion2 = Expession.eq(age,new Integer(30));
criteria = criteria.add(criterion1);
criteria = criteria.add(criterion2);
List resultList = criteria.list();
這種查詢方式使用的較少,主要是在查詢中需要用戶輸入一系列的查詢條件,如果采用HQL查詢代碼會(huì)比較煩。
(5)本地SQL查詢
三.Hibernate的檢索策略有幾種?
立即檢索----立即加載檢索方法指定的對(duì)象。
延遲檢索----延遲加載檢索方法指定的對(duì)象,只有當(dāng)初次獲取其屬性或調(diào)用其方法時(shí)才加載。
如果將<class>元素的lazy熟悉設(shè)置為true,那么Load()方法是延遲加載。
而不管lazy是true或false,get()和find()方法永遠(yuǎn)是立即檢索。
session.load()和session.get()的區(qū)別
Session.load/get方法均可以根據(jù)指定的實(shí)體類和id從數(shù)據(jù)庫(kù)讀取記錄,并返回與之對(duì)應(yīng)的實(shí)體對(duì)象。其區(qū)別在于:
如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會(huì)拋出一個(gè)
ObjectNotFoundException。執(zhí)行l(wèi)oad方法并不會(huì)真正去查詢DB,只有當(dāng)首次訪問(wèn)實(shí)體對(duì)象屬性時(shí)才會(huì)去DB中真正查詢。(即懶加載)
Load方法返回實(shí)體的代理類實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類。
load支持延遲加載,get不支持延遲加載。
load方法可以充分利用內(nèi)部緩存和二級(jí)緩存中的現(xiàn)有數(shù)據(jù),而get方法則僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找,如沒有發(fā)現(xiàn)對(duì)應(yīng)數(shù)據(jù),將越過(guò)二級(jí)緩存,直接調(diào)用SQL完成數(shù)據(jù)讀取。
四.Hibernate的緩存
Hibernate有2級(jí)緩存。
第一級(jí)緩存是session緩存,其是事務(wù)范圍內(nèi)的緩存,第一級(jí)緩存也是必需要的,無(wú)法清除。在第一級(jí)緩存中,每個(gè)持久化的實(shí)例對(duì)象都有一個(gè)OID.
第二級(jí)緩存是SessionFactory的外置緩存,是一個(gè)可以插拔的緩存插件,由SessionFactory負(fù)責(zé)管理。第二級(jí)緩存是進(jìn)程范圍內(nèi)的或者群集范圍內(nèi)的緩存。
hibernate面試題及答案(二)
一.Hibernate中對(duì)象的狀態(tài)有幾種?
3種狀態(tài),瞬時(shí)狀態(tài),持久化狀態(tài),游離狀態(tài)。
(1) 瞬時(shí)狀態(tài)----剛用new語(yǔ)句創(chuàng)建,尚未持久化,沒有被session所關(guān)聯(lián),DB中也沒有對(duì)
象的記錄。
(2) 持久化狀態(tài)----跟session關(guān)聯(lián),跟數(shù)據(jù)庫(kù)中的相關(guān)記錄對(duì)應(yīng)。
(3) 游離狀態(tài)-----由持久化對(duì)象轉(zhuǎn)變而來(lái),不再和session關(guān)聯(lián),數(shù)據(jù)庫(kù)中有可能存在與
之對(duì)應(yīng)的記錄。
二.Hibernate中關(guān)于繼承關(guān)系的映射方式
(1)每個(gè)類分層結(jié)構(gòu)一張表
優(yōu)點(diǎn):簡(jiǎn)單,只需要一張表,查詢效率高。
缺點(diǎn):需要在表中引入額外區(qū)分各個(gè)子類的字段,不能為所有的子類成員屬性對(duì)應(yīng)的字段定義Not null約束。
適用范圍:查詢性能要求高,子類屬性不是很多時(shí)。
(2)每個(gè)子類一張表,每張表中僅僅包含在當(dāng)前類中定義的屬性,不包含父類或子類的成員屬性。
優(yōu)點(diǎn):支持多態(tài)查詢和關(guān)聯(lián)查詢,符合關(guān)系數(shù)據(jù)模型的設(shè)計(jì)規(guī)則。 缺點(diǎn):查詢效率不是很高,需要通過(guò)表的內(nèi)連接或左外連接進(jìn)行查詢。 適用范圍:子類屬性非常多,需要對(duì)子類某些屬性對(duì)應(yīng)的字段加Not null約束,且對(duì)性能要求不是很高時(shí)。
(3)每個(gè)具體類一張表,每張表中包含在當(dāng)前類及其父類中的所有成員屬性對(duì)應(yīng)的字段。
優(yōu)點(diǎn):可以對(duì)子類的成員屬性定義Not null約束。 缺點(diǎn):不符合關(guān)系數(shù)據(jù)模型的設(shè)計(jì)規(guī)則,而且每個(gè)表中都存在基類的多余字段。 適用范圍:一般不使用。
三.數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別
數(shù)據(jù)庫(kù)系統(tǒng)提供了四種事務(wù)隔離級(jí)別供用戶選擇。不同的隔離級(jí)別采用不同的鎖類型來(lái)實(shí)現(xiàn),在四種隔離級(jí)別中,Serializable的隔離級(jí)別最高,Read Uncommited的隔離級(jí)別最低。大多數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別為Read Commited,如SqlServer,當(dāng)然也有少部分?jǐn)?shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別為Repeatable Read ,如Mysql
Read Uncommited:讀未提交數(shù)據(jù)(會(huì)出現(xiàn)臟讀,不可重復(fù)讀和幻讀)。
Read Commited:讀已提交數(shù)據(jù)(會(huì)出現(xiàn)不可重復(fù)讀和幻讀)
Repeatable Read:可重復(fù)讀(會(huì)出現(xiàn)幻讀)
Serializable:串行化
hibernate面試題及答案(三)
1. 請(qǐng)說(shuō)出Hibernate中持久化對(duì)象的生命周期以及各種狀態(tài)直接的區(qū)別,并描述相互之間是如何轉(zhuǎn)換的。
Hibernate中持久化對(duì)象的生命周期有臨時(shí)態(tài)、持久態(tài)和游離態(tài)三種。
處于臨時(shí)態(tài)的對(duì)象主鍵值為空,并且未與session關(guān)聯(lián),數(shù)據(jù)未保存到數(shù)據(jù)庫(kù)中
處于持久態(tài)的對(duì)象與session關(guān)聯(lián)起來(lái),持久化后對(duì)象中的數(shù)據(jù)被保存到數(shù)據(jù)庫(kù)中,并且主鍵值按照.hbm.xml文件中配置的生成方式生成相應(yīng)的值
處于游離態(tài)的對(duì)象脫離了session的管理,是持久化后的一種狀態(tài),主鍵值按照.hbm.xml文件中配置的生成方式生成相應(yīng)的值 當(dāng)new一個(gè)新的對(duì)象時(shí),該對(duì)象處于臨時(shí)態(tài)
當(dāng)該對(duì)象被當(dāng)作session的參數(shù)使用的時(shí)候,該對(duì)象處于持久態(tài)
事務(wù)提交,session關(guān)閉后,該對(duì)象處于游離態(tài)
2.hibernate與數(shù)據(jù)庫(kù)連接的實(shí)現(xiàn)?并解釋了一下,例如文件是通過(guò)流來(lái)實(shí)現(xiàn)的!hibernate與數(shù)據(jù)庫(kù)連接是通過(guò)什么實(shí)現(xiàn)的? Hibernate與數(shù)據(jù)庫(kù)的連接是通過(guò)JDBC實(shí)現(xiàn)的
3.spring和hibernate的事務(wù)管理方式有什么不同? hibernate的事務(wù)管理方式僅僅就是托管給JDBC(如果用JTA那么就是JTA),而JDBC的一切行為包括事務(wù)是基于一個(gè)connection的,那么hibernate委托給JDBC的事務(wù)也就是基于一個(gè)session。JTA與JDBC事務(wù)不同在于可以跨連接。
spring也是調(diào)用hibernate中事務(wù)管理的API。hibernate的事務(wù)管理,一般是編程性的。而委托給spring之后,可以使用聲明式的,也就是可以在XML之中配置哪些需要進(jìn)行事務(wù)管理,哪些不需要
4.用hibernate的session時(shí)要注意幾點(diǎn)
1.在更新數(shù)據(jù)時(shí),要用open()
2.使用完之后,要close(),這樣連接池會(huì)回收該連接。
5.說(shuō)說(shuō)在hibernate中使用Integer做映射和使用int做映射之間有什么差別
使用int做映射,hibernate會(huì)自動(dòng)把int類型轉(zhuǎn)換為Integer類型,以便統(tǒng)一以對(duì)象方式處理數(shù)據(jù)。使用Integer就無(wú)須轉(zhuǎn)換。 在從數(shù)據(jù)庫(kù)中取數(shù)據(jù)的時(shí)候,如果是用Integer做的映射,則要求PO對(duì)象中對(duì)應(yīng)的類型也必須為Integer類型,使用的時(shí)候需要轉(zhuǎn)換為int。如果是int型,則無(wú)須轉(zhuǎn)換。
6.一個(gè)網(wǎng)站應(yīng)用,請(qǐng)?jiān)O(shè)計(jì)一個(gè)持久化類User,他可能有多張會(huì)員卡號(hào)、需要多個(gè)email地址(數(shù)量不定)作為其身份驗(yàn)證的方式
設(shè)計(jì)三個(gè)類。User類、會(huì)員卡類和email類。User類與會(huì)員卡類和email類之間是一對(duì)多的關(guān)系
7.請(qǐng)簡(jiǎn)單評(píng)價(jià)該設(shè)計(jì)的優(yōu)劣:身份證號(hào)碼作為一個(gè)person表的主鍵
一個(gè)表的主鍵值設(shè)計(jì)最好不要采用具有業(yè)務(wù)含義的字段。理由有二:
1.具有業(yè)務(wù)含義的字段的長(zhǎng)度不固定
2.具有業(yè)務(wù)含義的字段的取值范圍不定。可能是純數(shù)字,也可能是純字符,或者是數(shù)字和字符的混合情況。
上述兩個(gè)方面一但發(fā)生變動(dòng)將不利于業(yè)務(wù)層的處理。
【hibernate面試題及答案】相關(guān)文章:
經(jīng)典面試題及答案04-04
面試題及答案04-04
小升初面試題及答案12-09
經(jīng)典的面試題及答案分析12-09
sql面試題及答案04-03
php面試題及答案04-02
android面試題及答案04-04
邏輯面試題及答案12-09
護(hù)士面試題及答案11-26