當前位置:
首頁 > 最新 > Hibernate面試題大全

Hibernate面試題大全

Hibernate常見面試題

Hibernate工作原理及為什麼要用?

Hibernate工作原理及為什麼要用?

讀取並解析配置文件

讀取並解析映射信息,創建SessionFactory

打開Sesssion

創建事務Transation

持久化操作

提交事務

關閉Session

關閉SesstionFactory

使用Hibernate框架就不用我們寫很多繁瑣的SQL語句。Hibernate實現了ORM,能夠將對象映射成資料庫表,從而簡化我們的開發!

Hibernate是如何延遲載入(懶載入)?

Hibernate是如何延遲載入(懶載入)?

通過設置屬性進行設置是否需要懶載入

當Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲載入,他節省了伺服器的內存開銷,從而提高了伺服器的性能。

Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)

Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)

它們通過配置文件中的來實現類之間的關聯關係的。

hibernate的三種狀態之間如何轉換

hibernate的三種狀態之間如何轉換

Hibernate中對象的狀態:

臨時/瞬時狀態

持久化狀態

遊離狀態

臨時/瞬時狀態

當我們直接new出來的對象就是臨時/瞬時狀態的..

該對象還沒有被持久化【沒有保存在資料庫中】

不受Session的管理

這裡寫圖片描述

持久化狀態

當保存在資料庫中的對象就是持久化狀態了

當調用session的save/saveOrUpdate/get/load/list等方法的時候,對象就是持久化狀態

在資料庫有對應的數據

受Session的管理

當對對象屬性進行更改的時候,會反映到資料庫中!

這裡寫圖片描述

我們來測試一下:當對對象屬性進行更改的時候,會反映到資料庫中!

這裡寫圖片描述

遊離狀態

當Session關閉了以後,持久化的對象就變成了遊離狀態了…

不處於session的管理

資料庫中有對應的記錄

這裡寫圖片描述

有了上面的基礎,我們就很容易說出它們之間的轉換了

new出來的對象是瞬時狀態->保存到資料庫中(受Session管理)就是持久化狀態->將session close掉就是遊離狀態

比較hibernate的三種檢索策略優缺點

比較hibernate的三種檢索策略優缺點

立即檢索:

優點: 對應用程序完全透明,不管對象處於持久化狀態,還是遊離狀態,應用程序都可以方便的從一個對象導航到與它關聯的對象;

缺點: 1.select語句太多;2.可能會載入應用程序不需要訪問的對象白白浪費許多內存空間;

立即檢索:;

延遲檢索:

優點: 由應用程序決定需要載入哪些對象,可以避免可執行多餘的select語句,以及避免載入應用程序不需要訪問的對象。因此能提高檢索性能,並且能節省內存空間;

缺點: 應用程序如果希望訪問遊離狀態代理類實例,必須保證他在持久化狀態時已經被初始化;

延遲載入:;

迫切左外連接檢索:

優點: 1對應用程序完全透明,不管對象處於持久化狀態,還是遊離狀態,應用程序都可以方便地沖一個對象導航到與它關聯的對象。2使用了外連接,select語句數目少;

缺點: 1 可能會載入應用程序不需要訪問的對象,白白浪費許多內存空間;2複雜的資料庫表連接也會影響檢索性能;

預先抓取: ;

hibernate都支持哪些緩存策略

hibernate都支持哪些緩存策略

usage的屬性有4種:

放入二級緩存的對象,只讀(Read-only);

非嚴格的讀寫(Nonstrict read/write)

讀寫; 放入二級緩存的對象可以讀、寫(Read/write);

基於事務的策略(Transactional)

hibernate裡面的sorted collection 和ordered collection有什麼區別

hibernate裡面的sorted collection 和ordered collection有什麼區別

sorted collection

是在內存中通過Java比較器進行排序的

ordered collection

是在資料庫中通過order by進行排序的

對於比較大的數據集,為了避免在內存中對它們進行排序而出現 Java中的OutOfMemoryError,最好使用ordered collection。

說下Hibernate的緩存機制

說下Hibernate的緩存機制

一級緩存:

Hibenate中一級緩存,也叫做session的緩存,它可以在session範圍內減少資料庫的訪問次數! 只在session範圍有效! Session關閉,一級緩存失效!

只要是持久化對象狀態的,都受Session管理,也就是說,都會在Session緩存中!

Session的緩存由hibernate維護,用戶不能操作緩存內容; 如果想操作緩存內容,必須通過hibernate提供的evit/clear方法操作

二級緩存:

這裡寫圖片描述

Hibernate的查詢方式有幾種

Hibernate的查詢方式有幾種

對象導航查詢(objectcomposition)

HQL查詢

1、 屬性查詢

2、 參數查詢、命名參數查詢

3、 關聯查詢

4、 分頁查詢

5、 統計函數

Criteria 查詢

SQLQuery本地SQL查詢

如何優化Hibernate?

如何優化Hibernate?

? 資料庫設計調整

? HQL優化

? API的正確使用(如根據不同的業務類型選用不同的集合及查詢API)

? 主配置參數(日誌,查詢緩存,fetch_size, batch_size等)

? 映射文件優化(ID生成策略,二級緩存,延遲載入,關聯優化)

? 一級緩存的管理

? 針對二級緩存,還有許多特有的策略

詳情可參考資料:

https://www.cnblogs.com/xhj123/p/6106088.html

談談Hibernate中inverse的作用

談談Hibernate中inverse的作用

inverse屬性默認是false,就是說關係的兩端都來維護關係。

比如Student和Teacher是多對多關係,用一個中間表TeacherStudent維護。Gp)

如果Student這邊inverse=」true」, 那麼關係由另一端Teacher維護,就是說當插入Student時,不會操作TeacherStudent表(中間表)。只有Teacher插入或刪除時才會觸發對中間表的操作。所以兩邊都inverse=」true」是不對的,會導致任何操作都不觸發對中間表的影響;當兩邊都inverse=」false」或默認時,會導致在中間表中插入兩次關係。

如果表之間的關聯關係是「一對多」的話,那麼inverse只能在「一」的一方來配置!

詳情可參考:

https://zhongfucheng.bitcron.com/post/hibernate/hibernate-inversehe-cascadeshu-xing-zhi-shi-yao-dian

JDBC hibernate 和 ibatis 的區別

JDBC hibernate 和 ibatis 的區別

jdbc:手動

手動寫sql

delete、insert、update要將對象的值一個一個取出傳到sql中,不能直接傳入一個對象。

select:返回的是一個resultset,要從ResultSet中一行一行、一個欄位一個欄位的取出,然後封裝到一個對象中,不直接返回一個對象。

ibatis的特點:半自動化

sql要手動寫

delete、insert、update:直接傳入一個對象

select:直接返回一個對象

hibernate:全自動

不寫sql,自動封裝

delete、insert、update:直接傳入一個對象

select:直接返回一個對象

在資料庫中條件查詢速度很慢的時候,如何優化?

在資料庫中條件查詢速度很慢的時候,如何優化?

建索引

減少表之間的關聯

優化sql,盡量讓sql很快定位數據,不要讓sql做全表查詢,應該走索引,把數據量大的表排在前面

簡化查詢欄位,沒用的欄位不要,已經對返回結果的控制,盡量返回少量數據

詳情可參考:

什麼是SessionFactory,她是線程安全么

什麼是SessionFactory,她是線程安全么

SessionFactory 是Hibrenate單例數據存儲和線程安全的,以至於可以多線程同時訪問。一個SessionFactory 在啟動的時候只能建立一次。SessionFactory應該包裝各種單例以至於它能很簡單的在一個應用代碼中儲存.

get和load區別

get和load區別

get()立即查詢

這裡寫圖片描述

load()懶載入

這裡寫圖片描述

1)get如果沒有找到會返回null, load如果沒有找到會拋出異常。

2)get會先查一級緩存, 再查二級緩存,然後查資料庫;load會先查一級緩存,如果沒有找到,就創建代理對象, 等需要的時候去查詢二級緩存和資料庫。

merge的含義:

merge的含義:

如果session中存在相同持久化標識(identifier)的實例,用用戶給出的對象的狀態覆蓋舊有的持久實例

如果session沒有相應的持久實例,則嘗試從資料庫中載入,或創建新的持久化實例,最後返回該持久實例

用戶給出的這個對象沒有被關聯到session上,它依舊是脫管的

詳情可參考:

http://cp3.iteye.com/blog/786019

persist和save的區別

persist和save的區別

persist不保證立即執行,可能要等到flush;

persist不更新緩存;

save, 把一個瞬態的實例持久化標識符,及時的產生,它要返回標識符,所以它會立即執行Sql insert

使用 save() 方法保存持久化對象時,該方法返回該持久化對象的標識屬性值(即對應記錄的主鍵值);

使用 persist() 方法來保存持久化對象時,該方法沒有任何返回值

參考資料:

主鍵生成 策略有哪些

主鍵生成 策略有哪些

主鍵的自動生成策略

identity 自增長(mysql,db2)

sequence 自增長(序列), oracle中自增長是以序列方法實現**

native 自增長【會根據底層資料庫自增長的方式選擇identity或sequence】

如果是mysql資料庫, 採用的自增長方式是identity

如果是oracle資料庫, 使用sequence序列的方式實現自增長

increment 自增長(會有並發訪問的問題,一般在伺服器集群環境使用會存在問題。)

指定主鍵生成策略為手動指定主鍵的值

assigned

指定主鍵生成策略為UUID生成的值

uuid

foreign(外鍵的方式)

簡述hibernate中getCurrentSession和openSession區別

簡述hibernate中getCurrentSession和openSession區別

1、getCurrentSession會綁定當前線程,而openSession不會,因為我們把hibernate交給我們的spring來管理之後,我們是有事務配置,這個有事務的線程就會綁定當前的工廠裡面的每一個session,而openSession是創建一個新session。

2、getCurrentSession事務是有spring來控制的,而openSession需要我們手動開啟和手動提交事務,

3、getCurrentSession是不需要我們手動關閉的,因為工廠會自己管理,而openSession需要我們手動關閉。

4、而getCurrentSession需要我們手動設置綁定事務的機制,有三種設置方式,jdbc本地的Thread、JTA、第三種是spring提供的事務管理機制org.springframework.orm.hibernate4.SpringSessionContext,而且srping默認使用該種事務管理機制

Hibernate中的命名SQL查詢指的是什麼?

Hibernate中的命名SQL查詢指的是什麼?

命名查詢指的是用標籤在影射文檔中定義的SQL查詢,可以通過使用Session.getNamedQuery()方法對它進行調用。命名查詢使你可以使用你所指定的一個名字拿到某個特定的查詢。

Hibernate中的命名查詢可以使用註解來定義,也可以使用我前面提到的xml影射問句來定義。在Hibernate中,@NameQuery用來定義單個的命名查詢,@NameQueries用來定義多個命名查詢。

為什麼在Hibernate的實體類中要提供一個無參數的構造器這一點非常重要?

為什麼在Hibernate的實體類中要提供一個無參數的構造器這一點非常重要?

每個Hibernate實體類必須包含一個 無參數的構造器, 這是因為Hibernate框架要使用Reflection API,通過調用Class.newInstance()來創建這些實體類的實例。如果在實體類中找不到無參數的構造器,這個方法就會拋出一個InstantiationException異常。

可不可以將Hibernate的實體類定義為final類?

可不可以將Hibernate的實體類定義為final類?

可以將Hibernate的實體類定義為final類,但這種做法並不好。因為Hibernate會使用代理模式在延遲關聯的情況下提高性能,如果你把實體類定義成final類之後,因為 Java不允許對final類進行擴展,所以Hibernate就無法再使用代理了,如此一來就限制了使用可以提升性能的手段。

最後

參考資料:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java3y 的精彩文章:

Oracle總結視圖、索引、事務、用戶許可權、批量操作

TAG:Java3y |