- 相關(guān)推薦
hibernate面試題
1. 請(qǐng)解釋Hibernate3.2主鍵的生成方式中,native和identity方式的區(qū)別。
Native主鍵生成方式會(huì)根據(jù)不同的底層數(shù)據(jù)庫(kù)自動(dòng)選擇Identity、Sequence、Hilo主鍵生成方式
特點(diǎn):根據(jù)不同的底層數(shù)據(jù)庫(kù)采用不同的主鍵生成方式。由于Hibernate會(huì)根據(jù)底層數(shù)據(jù)庫(kù)采用不同的映射方式,因此便于程序移植,項(xiàng)目中如果用到多個(gè)數(shù)據(jù)庫(kù)時(shí),可以使用這種方式。
Identity根據(jù)底層數(shù)據(jù)庫(kù),來(lái)支持自動(dòng)增長(zhǎng),不同的數(shù)據(jù)庫(kù)用不同的主鍵增長(zhǎng)方式。
特點(diǎn):與底層數(shù)據(jù)庫(kù)有關(guān),要求數(shù)據(jù)庫(kù)支持Identity,如
MySQl中是auto_increment,
SQL Server 中是Identity,支持的數(shù)據(jù)庫(kù)有MySql、SQL Server、DB2、Sybase和HypersonicSQL。
Identity無(wú)需Hibernate和用戶的干涉,使用較為方便,但不便于在不同的數(shù)據(jù)庫(kù)之間移植程序。
2. 請(qǐng)解釋為什么SessionFactory一般以單利方式使用。
SessionFactory是一個(gè)大型對(duì)象,而且線程安全。在一個(gè)程序中只需要一個(gè)
3. 請(qǐng)解釋說(shuō)明hibernate配置文件中dialect屬性的確切含義。
數(shù)據(jù)庫(kù)方言:多種數(shù)據(jù)庫(kù)擁有不同的語(yǔ)言語(yǔ)法,通過(guò)設(shè)置dialect指定所用的數(shù)據(jù)庫(kù),并生成對(duì)應(yīng)語(yǔ)法和語(yǔ)言的sql語(yǔ)句。
4,請(qǐng)解釋說(shuō)明Hibernate控制下的POJO<對(duì)象>會(huì)呈現(xiàn)三種狀態(tài),分別是transient、persistenet和detached,請(qǐng)解釋這三種狀態(tài)。
暫態(tài):數(shù)據(jù)庫(kù)中沒(méi)數(shù)據(jù)。跟session不相關(guān)。沒(méi)存過(guò)。
游離態(tài):在數(shù)據(jù)庫(kù)中有記錄,但是在session中沒(méi)有。需要手工同步。
持久態(tài):數(shù)據(jù)庫(kù)中有記錄,session中也有這記錄。自動(dòng)更新
5. 請(qǐng)解釋Session的load方法和get方法的不同;
load 在加載的時(shí)候會(huì)根據(jù)加載策略來(lái)加載東西,加載策略默認(rèn)為延遲加載,即只加載id.,如果需要用其它數(shù)據(jù),必須在session關(guān)閉之前,去加載某一 個(gè)屬性。lazy="true" or "false" 如果加載策略是立即加載,那么它在加載時(shí)會(huì)把數(shù)據(jù)信息全部加載,這個(gè)時(shí)候即使,關(guān)閉session,因?yàn)閿?shù)據(jù)已經(jīng)全部加載了,也能取得數(shù)據(jù)
get 會(huì)直接采用立即加載策略加載數(shù)據(jù),不管你配置的是延遲加載還是立即加載
關(guān)于立即加載和延遲加載 不僅只對(duì)自己這張表,將來(lái)表與表之間有關(guān)系時(shí),一樣會(huì)起作用。
如果對(duì)象不存在 get返回null load拋異常
6.請(qǐng)解釋cascade屬性和-orphan的區(qū)別。
: 在執(zhí)行 時(shí)進(jìn)行關(guān)聯(lián)操作。
all--orphan: 當(dāng)一個(gè)節(jié)點(diǎn)在對(duì)象圖中成為孤兒節(jié)點(diǎn)時(shí),刪除該節(jié)點(diǎn)。比如在一個(gè)一對(duì)多的關(guān)系中,Student包含多個(gè)book,當(dāng)在對(duì)象關(guān)系中刪除一個(gè)book時(shí),此book即成為孤兒節(jié)點(diǎn)。
7.請(qǐng)解釋inverse屬性的作用
inverse表“是否放棄維護(hù)關(guān)聯(lián)關(guān)系”(在Java里兩個(gè)對(duì)象產(chǎn)生關(guān)聯(lián)時(shí),對(duì)數(shù)據(jù)庫(kù)表的影響),在one-to-many和many-to-many的集合定義中使用,inverse="true"表示該對(duì)象不維護(hù)關(guān)聯(lián)關(guān)系;該屬性的值一般在使用有序集合時(shí)設(shè)置成false(注意hibernate的缺省值是false)。 one-to-many維護(hù)關(guān)聯(lián)關(guān)系就是更新外鍵。many-to-many維護(hù)關(guān)聯(lián)關(guān)系就是在中間表增減記錄。
8.請(qǐng)解釋Hibernate查詢中出現(xiàn)的N+1問(wèn)題,并提出解決方案。
Hibernate在檢索與Customer關(guān)聯(lián)的Order對(duì)象時(shí),使用了默認(rèn)的立即檢索策略。這種檢索策略存在兩大不足:
(1) select語(yǔ)句的數(shù)目太多,需要頻繁的訪問(wèn)數(shù)據(jù)庫(kù),會(huì)影響檢索性能。如果需要查詢n個(gè)Customer對(duì)象,那么必須執(zhí)行n+1次select查詢語(yǔ)句。這就是經(jīng)典的n+1次select查詢問(wèn)題。
(2)在應(yīng)用邏輯只需要訪問(wèn)Customer對(duì)象,而不需要訪問(wèn)Order對(duì)象的場(chǎng)合,加載Order對(duì)象完全是多余的操作,這些多余的Order對(duì)象白白浪費(fèi)了許多內(nèi)存空間。
為了解決以上問(wèn)題,Hibernate提供了其他兩種檢索策略:延遲檢索策略和迫切左外連接檢索策略。延遲檢索策略能避免多余加載應(yīng)用程序不需要訪問(wèn)的關(guān)聯(lián)對(duì)象,迫切左外連接檢索策略則充分利用了SQL的外連接查詢功能,能夠減少select語(yǔ)句的數(shù)目。
9.請(qǐng)簡(jiǎn)要的描述一下使用Hibernate進(jìn)行大批量更新的經(jīng)驗(yàn);
直接使用hibernate API 進(jìn)行批量更新和批量刪除都不推薦,而直接通過(guò)JDBC API執(zhí)行相關(guān)的SQl語(yǔ)句或調(diào)用相關(guān)的存儲(chǔ)過(guò)程是最佳的方式。
10,請(qǐng)簡(jiǎn)要的描述一下使用Hibernate二級(jí)高速緩存的經(jīng)驗(yàn)
1.Hibernate3的二級(jí)緩存和session級(jí)別的緩存一樣都只對(duì)實(shí)體對(duì)象做緩存,不對(duì)屬性級(jí)別的查詢做緩存;二級(jí)緩存的生命周期和sessionFactory的生命周期是一樣的,sessionFactory可以管理二級(jí)緩存;
2.sessionFactory級(jí)別的緩存,需要手動(dòng)配置;所有的session可以共享sessionFactory 級(jí)別的緩存;(一般把一些不經(jīng)常變化的實(shí)體對(duì)象放到sessionFactory級(jí)別的緩存中,適合放不經(jīng)常變化的實(shí)體對(duì)象。)
3.Hiberante3二級(jí)緩存的配置和使用方法如下:
必須把ehcache.jar包導(dǎo)入,然后到Hibernate3.2的etc文件下把ehcache.xml復(fù)制到工程src目錄下(ehcache.xml里邊的參數(shù)里邊有詳細(xì)英文說(shuō)明);
說(shuō)明:ehcache.jar是第三方法的緩存產(chǎn)品,hiberante只是把它做了集成,還有好多第三方hibernate集成的緩存產(chǎn)品,相關(guān)說(shuō)明請(qǐng)查閱hiberante3開(kāi)發(fā)手冊(cè);ehcache是不支持分布應(yīng)用的,如果有分布式需求,請(qǐng)換成支持分布式的二級(jí)緩存產(chǎn)品,hiberate3開(kāi)發(fā)手冊(cè)都有相頭說(shuō)明。配置方法都類(lèi)似);
4.Hibernate3的二級(jí)緩存默認(rèn)是開(kāi)起的,也可以指定開(kāi)起。
11,Query的list和iterator方法的不同。
list不會(huì)使用緩存,而iterate會(huì)先取數(shù)據(jù)庫(kù)select id出來(lái),然后一個(gè)id一個(gè)id的load,如果在緩存里面有,就從緩存取,沒(méi)有的話就去數(shù)據(jù)庫(kù)load。
不管是list方法還是iterate方法,第一次查詢的時(shí)候,它們的查詢方式很它們平時(shí)的方式是一樣的,list執(zhí)行一條sql,iterate執(zhí)行1+N條,多出來(lái)的行為是它們填充了緩存
查詢緩存需要打開(kāi)相關(guān)類(lèi)的class緩存。list和iterate方法第一次執(zhí)行的時(shí)候,都是既填充查詢緩存又填充class緩存的。
這里還有一個(gè)很容易被忽視的重要問(wèn)題,即打開(kāi)查詢緩存以后,即使是list方法也可能遇到1+N的問(wèn)題!
【hibernate面試題】相關(guān)文章:
投行面試題07-24
軟件測(cè)試面試題01-17
中層副職競(jìng)聘面試題09-05
來(lái)看看谷歌的面試題08-17
考察個(gè)人價(jià)值觀的另類(lèi)面試題02-21
面試題:給我們一個(gè)錄取你的理由?11-16