常見面試問題及答案
Hibernate中g(shù)et和load有什么不同之處
Hibernate中save、persist和saveOrUpdate這三個方法的不同之處?
除了get和load,這又是另外一個經(jīng)常出現(xiàn)的Hibernate面試問題。 所有這三個方法,也就是save()、saveOrUpdate()和persist()都是用于將對象保存到數(shù)據(jù)庫中的方法,但其中有些細微的差別。例如,save()只能INSERT記錄,但是saveOrUpdate()可以進行 記錄的INSERT和UPDATE。還有,save()的返回值是一個Serializable對象,而persist()方法返回值為void。你還可以訪問 save、persist以及saveOrUpdate,找到它們所有的不同之處。
Hibernate中的命名SQL查詢指的是什么?
Hibernate的這個面試問題同Hibernate提供的查詢功能相關(guān)。命名查詢指的是用
Hibernate中的SessionFactory有什么作用? SessionFactory是線程安全的嗎?
這也是Hibernate框架的常見面試問題。顧名思義,SessionFactory就是一個用于創(chuàng)建Hibernate的Session對象的工廠。SessionFactory通常是在應(yīng)用啟動時創(chuàng)建好的,應(yīng)用程序中的代碼用它來獲得Session對象。作為一個單個的數(shù)據(jù)存儲,它也是 線程安全的,所以多個線程可同時使用同一個SessionFactory。Java JEE應(yīng)用一般只有一個SessionFactory,服務(wù)于客戶請求的各線程都通過這個工廠來獲得Hibernate的Session實例,這也是為什么SessionFactory接口的實現(xiàn)必須是線程安全的原因。還有,SessionFactory的內(nèi)部狀態(tài)包含著同對象關(guān)系影射有關(guān)的所有元數(shù)據(jù),它是 不可變的,一旦創(chuàng)建好后就不能對其進行修改了。
Hibernate中的Session指的是什么? 可否將單個的Session在多個線程間進行共享?
前面的問題問完之后,通常就會接著再問這兩個問題。問完SessionFactory的問題后就該輪到Session了。Session代表著Hibernate所做的一小部分工作,它負責維護者同數(shù)據(jù)庫的鏈接而且 不是線程安全的,也就是說,Hibernage中的Session不能在多個線程間進行共享。雖然Session會以主動滯后的方式獲得數(shù)據(jù)庫連接,但是Session最好還是在用完之后立即將其關(guān)閉。
hibernate中sorted collection和ordered collection有什么不同?
T這個是你會碰到的所有Hibernate面試問題中比較容易的問題。sorted collection是通過使用 Java的Comparator在內(nèi)存中進行排序的,ordered collection中的排序用的是數(shù)據(jù)庫的order by子句。對于比較大的數(shù)據(jù)集,為了避免在內(nèi)存中對它們進行排序而出現(xiàn) Java中的OutOfMemoryError,最好使用ordered collection。
Hibernate中transient、persistent、detached對象三者之間有什么區(qū)別?
在Hibernate中,對象具有三種狀態(tài):transient、persistent和detached。同Hibernate的session有關(guān)聯(lián)的對象是persistent對象。對這種對象進行的所有修改都會按照事先設(shè)定的刷新策略,反映到數(shù)據(jù)庫之中,也即,可以在對象的任何一個屬性發(fā)生改變時自動刷新,也可以通過調(diào)用Session.flush()方法顯式地進行刷新。如果一個對象原來同Session有關(guān)聯(lián)關(guān)系,但當下卻沒有關(guān)聯(lián)關(guān)系了,這樣的對象就是detached的對象。你可以通過調(diào)用任意一個session的update()或者saveOrUpdate()方法,重新將該detached對象同相應(yīng)的seesion建立關(guān)聯(lián)關(guān)系。Transient對象指的是新建的持久化類的實例,它還從未同Hibernate的任何Session有過關(guān)聯(lián)關(guān)系。同樣的,你可以調(diào)用persist()或者save()方法,將transient對象變成persistent對象。可要記住,這里所說的transient指的可不是 Java中的transient關(guān)鍵字,二者風馬牛不相及。