天天看點

Java面試題之Hibernate

Java面試題之Hibernate

1.簡書一下Hibernated的開發流程

第一步:加載Hibernate的配置檔案,讀取配置檔案的參數,
           
第二步:建立SessionFactory會話工廠(内部有連接配接池)
           
第三步:打開Session 連接配接
           
第四步:開啟事務
           
第五步:運作操作
           
第六步:送出事務
           
第七步:關閉session
           
第八步:關閉連接配接池
           

2.Hibernate 中對對象的三種狀态

瞬時狀态:不存在持久化辨別的OID,尚未與HibernateSession對象關聯,被認為處于瞬時狀态,失去引用将被JVM回收
           
持久态:存在持久辨別OID,與目前session有關聯,并且相關聯Session沒有關閉,并且事務未送出
           
遊離态:存在持久化辨別OID,但沒有與目前Session關聯,
           

3.Hibernate的緩存機制

Hibernate緩存機制分為兩層,Hibernate的一級緩存和Hibernate二級緩存。
           
1.Hibernate一級緩存(Session的緩存)
           

Session 實作了第一級Cache,屬于事務級資料緩沖,一旦事務結束,緩存随之失效,一個Session的生命周期對應一個資料庫事務或一個程式事務。

Session-Cache總是被打開并且不能被關閉的
           

Session-Cache 保證一個Session中兩次請求同一個對象時,取得的對象是一個Java執行個體,有時他可以避免資料不必要的沖突

Hibernate 二級緩存(SessionFactory的緩存)

(1)Hibernate 二級緩沖是SessionFactory範圍内的緩存,所有的Session共享一個二級緩存,在二級緩存中儲存持久化執行個體

的散裝形式的資料
           

(2)持久化不同的資料需要不同的Cache 政策,比如一些因素影響Cache政策的選擇:資料的讀寫比例,資料表能否被其他的應用程式所通路等。

設定Hibernate 二級緩存需要分兩步,首先,确認使用什麼資料并發政策,然後,配置緩存期間時間并設定Cache提供器
           
Hibernate的查詢方式常見有三種:HQL,QBC(命名查詢),以及使用原生SQL查詢
           

Hibernate和JDBC優缺點對比

相同點:
           
1)兩者都是java資料庫操作的中間件
           
2)兩者對資料庫進行直接操作的對象時線程不安全的,都需及時關閉
           
3)兩者都可對資料庫的更新操作進行顯示的事務處理
           
使用的SQL語言不同:JDBC使用是基于關系型資料庫的标準SQL語言。HIbernate使用是HQL語言
           
操作的對象不同:JDBC操作的是資料,将資料通過SQL語句直接發送的資料庫中執行,Hibernate操作的是持久化對象,有第吃了個持久化對象的資料更新到資料庫中
           
資料狀态不同:JDBC操作的資料時瞬時的,變量的值無法與資料庫中值保持一緻,而Hibernate操作的資料時可持久化的,即持久化對象的資料屬性的值是可以跟資料庫中的值保持一緻
           
關于Hibernate的orm思想你了解多少?
           
ORM指的是對象關系型映射,指的就是我們通過建立實體類對象和資料庫中的表關系進行一一對應,來實作通過操作實體類對象來更改資料庫裡邊的資料資訊,這裡邊起到關鍵作用的是通過HIbernate的映射檔案+Hibernate的核心配置檔案
           

get和load的差別

1.get是立即加載,load是延時加載
           

2.get會先查一級緩存,在查二級緩存,然後查資料庫;load會先查一級緩存,如果沒找到,就建立代理對象,等需要的時候去查詢二級緩存和資料庫,(這裡展現load的延遲加載的特性)

3.get如果沒有找到會傳回null,load如果沒有找到會抛出異常
           

4.當我們使用session.load方法加載一個對象時,此時并不會發出SQL語句,目前得到得這個對象其實是一個代理對象。這個代理對象隻儲存了實體對象的id值,隻有當我們使用這個對象,得到其它屬性時,這個時候才會發出SQL語句,從資料庫中去查詢我們的對對象,相當于load的延遲加載方式。get就直接的多,當我們使用Session.get()方法來得到一個對象時,不管我們使不使用這個對象,此時都會發出SQL語句從資料庫中查詢出來

如何進行Hibernate 的優化

1.資料庫設計調整。

2.HQL優化

3.API的正确使用

4.主配置參數(日志,查詢緩存,fetch_sieze,batch_size).

5。映射檔案優化(ID生成政策,二級緩存,延遲加載,關聯優化)

6.一級緩存的管理

7.針對二級緩存,還有許多特有的政策

8.事務控制政策