這篇文章主要介紹“Hibernate面試題有哪些”,在日常操作中,相信很多人在Hibernate面試題有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hibernate面試題有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯專注于木壘哈薩克網站建設服務及定制,我們擁有豐富的企業(yè)做網站經驗。 熱誠為您提供木壘哈薩克營銷型網站建設,木壘哈薩克網站制作、木壘哈薩克網頁設計、木壘哈薩克網站官網定制、成都小程序開發(fā)服務,打造木壘哈薩克網絡公司原創(chuàng)品牌,更為您提供木壘哈薩克網站排名全網營銷落地服務。1、什么是Hibernate?
Hibernate是一個架構, 用來對應Java對象數據庫表對象。使用一個xml文件來配置。
2、為什么要使用 Hibernate?
①Hibernate 是對 jdbc 的封裝,大大簡化了數據訪問層的繁瑣的重復性代碼。
②Hibernate 是一個優(yōu)秀的 ORM 實現,很多程度上簡化了 DAO 層的編碼功能。
③可以很方便的進行數據庫的移植工作。
④提供了緩存機制,是程序執(zhí)行更改的高效。
3、什么是 ORM 框架?
ORM(Object Relation Mapping)對象關系映射,是把數據庫中的關系數據映射成為程序中的對象。
使用 ORM 的優(yōu)點:提高了開發(fā)效率降低了開發(fā)成本、開發(fā)更簡單更對象化、可移植更強。
4、Hibernate 中如何在控制臺查看打印的 SQL 語句?
在Config里面把 Hibernate. show_SQL 設置為 true 就可以。但不建議開啟,開啟之后會降低程序的運行效率。
5、Hibernate中get和load有什么不同之處?
把get和load放到一起進行對比是Hibernate面試時最常問到的問題,這是因為只有正確理解get()和load()這二者后才有可能高效地使用Hibernate。
get和load的大區(qū)別是,如果在緩存中沒有找到相應的對象,get將會直接訪問數據庫并返回一個完全初始化好的對象,而這個過程有可能會涉及到多個數據庫調用。
而load方法在緩存中沒有發(fā)現對象的情況下,只會返回一個代理對象,只有在對象getId()之外的其它方法被調用時才會真正去訪問數據庫,這樣就能在某些情況下大幅度提高性能。
你也可以參考 Hibernate中get和load的不同之處, 此鏈接給出了更多的不同之處并對該問題進行了更細致的討論。
6、Hibernate 是如何工作的?
①讀取并解析配置文件。
②讀取并解析映射文件,創(chuàng)建SessionFactory。
③打開 Session。
④創(chuàng)建事務。
⑤進行持久化操作。
⑥提交事務。
⑦關閉 Session。
⑧關閉 SessionFactory。
7、Hibernate中save、persist和saveOrUpdate這三個方法的不同之處?
除了get和load,這又是另外一個經常出現的Hibernate面試問題。 所有這三個方法,也就是save()、saveOrUpdate()和persist()都是用于將對象保存到數據庫中的方法,但其中有些細微的差別。
例如,save()只能INSERT記錄,但是saveOrUpdate()可以進行 記錄的INSERT和UPDATE。
還有,save()的返回值是一個Serializable對象,而persist()方法返回值為void。你還可以訪問 save、persist以及saveOrUpdate,找到它們所有的不同之處。
8、Hibernate中的命名SQL查詢指的是什么?
Hibernate的這個面試問題同Hibernate提供的查詢功能相關。命名查詢指的是用標簽在影射文檔中定義的SQL查詢,可以通過使用Session.getNamedQuery()方法對它進行調用。
命名查詢使你可以使用你所指定的一個名字拿到某個特定的查詢。 Hibernate中的命名查詢可以使用注解來定義,也可以使用我前面提到的xml影射問句來定義。
在Hibernate中,@NameQuery用來定義單個的命名查詢,@NameQueries用來定義多個命名查詢。
9、在 Hibernate 中 Java 對象的狀態(tài)有哪些 ?
①臨時狀態(tài)(transient):不處于 Session 的緩存中。OID 為 null 或 等于 id 的 unsaved-value 屬性值 。
②持久化狀態(tài)(persistent):加入到 Session 的緩存中。
③游離狀態(tài)(detached):已經被持久化,但不再處于 Session 的緩存中。
10、Hibernate中的SessionFactory有什么作用?
SessionFactory是線程安全的嗎? 這也是Hibernate框架的常見面試問題。顧名思義,SessionFactory就是一個用于創(chuàng)建Hibernate的Session對象的工廠。
SessionFactory通常是在應用啟動時創(chuàng)建好的,應用程序中的代碼用它來獲得Session對象。作為一個單個的數據存儲,它也是 線程安全的,所以多個線程可同時使用同一個SessionFactory。
Java JEE應用一般只有一個SessionFactory,服務于客戶請求的各線程都通過這個工廠來獲得Hibernate的Session實例,這也是為什么SessionFactory接口的實現必須是線程安全的原因。
還有,SessionFactory的內部狀態(tài)包含著同對象關系影射有關的所有元數據,它是不可變的,一旦創(chuàng)建好后就不能對其進行修改了。
11、Hibernate中的Session指的是什么? 可否將單個的Session在多個線程間進行共享?
前面的問題問完之后,通常就會接著再問這兩個問題。問完SessionFactory的問題后就該輪到Session了。Session代表著Hibernate所做的一小部分工作,它負責維護者同數據庫的鏈接而且不是線程安全的。
也就是說,Hibernage中的Session不能在多個線程間進行共享。雖然Session會以主動滯后的方式獲得數據庫連接,但是Session最好還是在用完之后立即將其關閉。
12、Hibernate中sorted collection和ordered collection有什么不同?
這個是你會碰到的所有Hibernate面試問題中比較容易的問題。sorted collection是通過使用 Java的Comparator在內存中進行排序的,ordered collection中的排序用的是數據庫的order by子句。
對于比較大的數據集,為了避免在內存中對它們進行排序而出現 Java中的OutOfMemoryError,最好使用ordered collection。
13、Hibernate中transient、persistent、detached對象三者之間有什么區(qū)別?
在Hibernate中,對象具有三種狀態(tài):transient、persistent和detached。同Hibernate的session有關聯的對象是persistent對象。
對這種對象進行的所有修改都會按照事先設定的刷新策略,反映到數據庫之中,也即,可以在對象的任何一個屬性發(fā)生改變時自動刷新,也可以通過調用Session.flush()方法顯式地進行刷新。
如果一個對象原來同Session有關聯關系,但當下卻沒有關聯關系了,這樣的對象就是detached的對象。你可以通過調用任意一個session的()或者saveOrUpdate()方法,重新將該detached對象同相應的seesion建立關聯關系。
Transient對象指的是新建的持久化類的實例,它還從未同Hibernate的任何Session有過關聯關系。同樣的,你可以調用persist()或者save()方法,將transient對象變成persistent對象。
可要記住,這里所說的transient指的可不是 Java中的transient關鍵字,二者風馬牛不相及。
14、Hibernate中Session的lock()方法有什么作用?
這是一個比較棘手的Hibernate面試問題,因為Session的lock()方法重建了關聯關系卻并沒有同數據庫進行同步和更新。因此,你在使用lock()方法時一定要多加小心。
順便說一下,在進行關聯關系重建時,你可以隨時使用Session的()方法同數據庫進行同步。有時這個問題也可以這么來問:Session的lock()方法和()方法之間有什么區(qū)別?。這個小節(jié)中的關鍵點也可以拿來回答這個問題。
15、Hibernate中二級緩存指的是什么?
這是同Hibernate的緩存機制相關的第一個面試問題,不出意外后面還會有更多這方面的問題。二級緩存是在SessionFactory這個級別維護的緩存,它能夠通過節(jié)省幾番數據庫調用往返來提高性能。還有一點值得注意,二級緩存是針對整個應用而不是某個特定的session的。
16、Hibernate中的查詢緩存指的是什么?
這個問題有時是作為上個Hibernate面試問題的后繼問題提出的。查詢緩存實際上保存的是sql查詢的結果,這樣再進行相同的sql查詢就可以之間從緩存中拿到結果了。
為了改善性能,查詢緩存可以同二級緩存一起來使用。Hibernate支持用多種不同的開源緩存方案,比如EhCache,來實現查詢緩存。
17、為什么在Hibernate的實體類中要提供一個無參數的構造器這一點非常重要?
每個Hibernate實體類必須包含一個 無參數的構造器, 這是因為Hibernate框架要使用Reflection API,通過調用Class.newInstance()來創(chuàng)建這些實體類的實例。如果在實體類中找不到無參數的構造器,這個方法就會拋出一個InstantiationException異常。
18、可不可以將Hibernate的實體類定義為final類?
是的,你可以將Hibernate的實體類定義為final類,但這種做法并不好。因為Hibernate會使用代理模式在延遲關聯的情況下提高性能,如果你把實體類定義成final類之后,因為 Java不允許對final類進行擴展,所以Hibernate就無法再使用代理了,如此一來就限制了使用可以提升性能的手段。
不過,如果你的持久化類實現了一個接口而且在該接口中聲明了所有定義于實體類中的所有public的方法,你就能夠避免出現前面所說的不利后果。
19、Hibernate的優(yōu)缺點
①優(yōu)點:
> 對 JDBC 訪問數據庫的代碼做了封裝,簡化了數據訪問層繁瑣的重復 性代碼 ;
> 映射的靈活性, 它支持各種關系數據庫, 從一對一到多對多的各種復 雜關系;
> 非侵入性、移植性會好;
> 緩存機制: 提供一級緩存和二級緩存。
②缺點:
> 無法對 SQL 進行優(yōu)化 ;
> 框架中使用 ORM 原則, 導致配置過于復雜;
> 執(zhí)行效率和原生的 JDBC 相比偏差: 特別是在批量數據處理的時候 ;
> 不支持批量修改、刪除 。
20、Hibernate 實體類必須要有無參構造函數嗎?為什么?
Hibernate 中每個實體類必須提供一個無參構造函數,因為 Hibernate 框架要使用 reflection api,通過調用 ClassnewInstance() 來創(chuàng)建實體類的實例,如果沒有無參的構造函數就會拋出異常。
到此,關于“Hibernate面試題有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯-成都網站建設公司網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
本文名稱:Hibernate面試題有哪些-創(chuàng)新互聯
網頁網址:http://jinyejixie.com/article38/dchesp.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站設計公司、網站制作、網頁設計公司、外貿網站建設、網站策劃、微信公眾號
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯