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