你當前所在位置:首頁 > IT就業問題 > Java面試題及答案(12/19)——Hibernate

Java面試題及答案(12/19)——Hibernate

113. 為什么要使用 hibernate?

 

● 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。

● Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

● hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。

● hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

 

114. 什么是 ORM 框架?

 

對象-關系映射(Object-Relational Mapping,簡稱ORM),面向對象的開發方法是當今企業級應用開發環境中的主流開發方法,關系數據庫是企業級應用環境中永久存放數據的主流數據存儲系統。對象和關系數據是業務實體的兩種表現形式,業務實體在內存中表現為對象,在數據庫中表現為關系數據。內存中的對象之間存在關聯和繼承關系,而在數據庫中,關系數據無法直接表達多對多關聯和繼承關系。因此,對象-關系映射(ORM)系統一般以中間件的形式存在,主要實現程序對象到關系數據庫數據的映射.

 

115. hibernate 中如何在控制臺查看打印的 sql 語句?

 

在 Config 里面把 hibernate. show_SQL 設置為 true 就可以。但不建議開啟,開啟之后會降低程序的運行效率。

 

116. hibernate 有幾種查詢方式?

 

● hql查詢

● sql查詢

● 條件查詢

 

Java面試題-Hibernate

 

117. hibernate 實體類可以被定義為 final 嗎?

 

可以將Hibernate的實體類定義為final類,但這種做法并不好。因為Hibernate會使用代理模式在延遲關聯的情況下提高性能,如果你把實體類定義成final類之后,因為 Java不允許對final類進行擴展,所以Hibernate就無法再使用代理了,如此一來就限制了使用可以提升性能的手段。不過,如果你的持久化類實現了一個接口而且在該接口中聲明了所有定義于實體類中的所有public的方法輪到話,你就能夠避免出現前面所說的不利后果。

 

118. 在 hibernate 中使用 Integer 和 int 做映射有什么區別?

 

在Hibernate中,如果將OID定義為Integer類型,那么Hibernate就可以根據其值是否為null而判斷一個對象是否是臨時的,如果將OID定義為了int類型,還需要在hbm映射文件中設置其unsaved-value屬性為0。

 

119. hibernate 是如何工作的?

 

hibernate工作原理:

 

Java面試題-Hibernate

 

120. get()和 load()的區別?

 

● load() 沒有使用對象的其他屬性的時候,沒有SQL 延遲加載

● get() 沒有使用對象的其他屬性的時候,也生成了SQL 立即加載

 

121. 說一下 hibernate 的緩存機制?

 

Hibernate中的緩存分為一級緩存和二級緩存。

 

一級緩存就是 Session 級別的緩存,在事務范圍內有效是,內置的不能被卸載。二級緩存是 SesionFactory級別的緩存,從應用啟動到應用結束有效。是可選的,默認沒有二級緩存,需要手動開啟。保存數據庫后,緩存在內存中保存一份,如果更新了數據庫就要同步更新。

 

什么樣的數據適合存放到第二級緩存中?

 

Java面試題-Hibernate

 

擴展:hibernate的二級緩存默認是不支持分布式緩存的。使用 memcahe,redis等中央緩存來代替二級緩存。

 

122. hibernate 對象有哪些狀態?

 

hibernate里對象有三種狀態:

 

● Transient(瞬時):對象剛new出來,還沒設id,設了其他值。

● Persistent(持久):調用了save()、saveOrUpdate(),就變成Persistent,有id。

● etached(脫管):當session close()完之后,變成Detached。

 

Java面試題-Hibernate

 

123. 在 hibernate 中 getCurrentSession 和 openSession 的區別是什么?

 

openSession 從字面上可以看得出來,是打開一個新的session對象,而且每次使用都是打開一個新的session,假如連續使用多次,則獲得的session不是同一個對象,并且使用完需要調用close方法關閉session。

 

getCurrentSession ,從字面上可以看得出來,是獲取當前上下文一個session對象,當第一次使用此方法時,會自動產生一個session對象,并且連續使用多次時,得到的session都是同一個對象,這就是與openSession的區別之一,簡單而言,getCurrentSession 就是:如果有已經使用的,用舊的,如果沒有,建新的。

 

注意:在實際開發中,往往使用getCurrentSession多,因為一般是處理同一個事務(即是使用一個數據庫的情況),所以在一般情況下比較少使用openSession或者說openSession是比較老舊的一套接口了。

 

124. hibernate 實體類必須要有無參構造函數嗎?為什么?

 

必須,因為hibernate框架會調用這個默認構造方法來構造實例對象,即Class類的newInstance方法,這個方法就是通過調用默認構造方法來創建實例對象的。

 

另外再提醒一點,如果你沒有提供任何構造方法,虛擬機會自動提供默認構造方法(無參構造器),但是如果你提供了其他有參數的構造方法的話,虛擬機就不再為你提供默認構造方法,這時必須手動把無參構造器寫在代碼里,否則new Xxxx()是會報錯的,所以默認的構造方法不是必須的,只在有多個構造方法時才是必須的,這里“必須”指的是“必須手動寫出來”。


課程預約

极速1分彩_Welcome