1. 程式人生 > >Hibernate常見面試題

Hibernate常見面試題

1、什麼是Hibernate的併發機制?怎麼去處理併發問題?

Hibernate併發機制:

a、Hibernate的Session物件是非執行緒安全的,對於單個請求,單個會話,單個的工作單元(即單個事務,單個執行緒),它通常只使用一次, 然後就丟棄。

  如果一個Session 例項允許共享的話,那些支援併發執行的,例如Http request,session beans將會導致出現資源爭用。 

 如果在Http Session中有hibernate的Session的話,就可能會出現同步訪問Http Session。只要使用者足夠快的點選瀏覽器的“重新整理”,  就會導致兩個併發執行的執行緒使用同一個Session。  
  • 1
  • 2
  • 3
  • 4

b、多個事務併發訪問同一塊資源,可能會引發第一類丟失更新,髒讀,幻讀,不可重複讀,第二類丟失更新一系列的問題。

解決方案:設定事務隔離級別。 
Serializable:序列化。隔離級別最高 
Repeatable Read:可重複讀 
Read Committed:已提交資料讀 
Read Uncommitted:未提交資料讀。隔離級別最差 
設定鎖:樂觀鎖和悲觀鎖。 
樂觀鎖:使用版本號或時間戳來檢測更新丟失,在的對映中設定 optimistic-lock=”all”可以在沒有版本或者時間戳屬性對映的情況下實現 版本檢查,此時Hibernate將比較一行記錄的每個欄位的狀態 行級悲觀鎖:Hibernate總是使用資料庫的鎖定機制,從不在記憶體中鎖定物件!只要為JDBC連線指定一下隔 離級別,然後讓資料庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不同的鎖定級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;

2、update和saveOrUpdate的區別?

update()和saveOrUpdate()是用來對跨Session的PO進行狀態管理的。 
update()方法操作的物件必須是持久化了的物件。也就是說,如果此物件在資料庫中不存在的話,就不能使用update()方法。 
saveOrUpdate()方法操作的物件既可以使持久化了的,也可以使沒有持久化的物件。如果是持久化了的物件呼叫saveOrUpdate()則會 更新資料庫中的物件;如果是未持久化的物件使用此方法,則save到資料庫中。

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

當物件由瞬時狀態(Transient)一save()時,就變成了持久化狀態; 
當我們在Session裡儲存物件的時候,實際是在Session的Map裡存了一份, 也就是它的快取裡放了一份,然後,又到資料庫裡存了一份,在快取裡這一份叫持久物件(Persistent)。 Session 一 Close()了,它的快取也都關閉了,整個Session也就失效了,這個時候,這個物件變成了遊離狀態(Detached),但資料庫中還是存在的。 
當遊離狀態(Detached)update()時,又變為了持久狀態(Persistent)。 
當持久狀態(Persistent)delete()時,又變為了瞬時狀態(Transient), 此時,資料庫中沒有與之對應的記錄。

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

1立即檢索; 
優點: 對應用程式完全透明,不管物件處於持久化狀態,還是遊離狀態,應用程式都可以方便的從一個物件導航到與它關聯的物件; 
缺點: 1.select語句太多;2.可能會載入應用程式不需要訪問的物件白白浪費許多記憶體空間; 
2延遲檢索: 
優點: 由應用程式決定需要載入哪些物件,可以避免可執行多餘的select語句,以及避免載入應用程式不需要訪問的物件。因此能提高檢索效能,並且能節省記憶體空間; 
缺點: 應用程式如果希望訪問遊離狀態代理類例項,必須保證他在持久化狀態時已經被初始化; 
3 迫切左外連線檢索 
優點: 1對應用程式完全透明,不管物件處於持久化狀態,還是遊離狀態,應用程式都可以方便地衝一個物件導航到與它關聯的物件。2使用了外連線,select語句數目少; 
缺點: 1 可能會載入應用程式不需要訪問的物件,白白浪費許多記憶體空間;2複雜的資料庫表連線也會影響檢索效能;

5、如何在控制檯看到hibernate生成並執行的sql

在定義資料庫和資料庫屬性的檔案applicationConfig.xml裡面,把hibernate.show_sql 設定為true 
這樣生成的SQL就會在控制檯出現了 
注意:這樣做會加重系統的負擔,不利於效能調優

6、hibernate都支援哪些快取策略

Read-only: 這種策略適用於那些頻繁讀取卻不會更新的資料,這是目前為止最簡單和最有效的快取策略 
* Read/write:這種策略適用於需要被更新的資料,比read-only更耗費資源,在非JTA環境下,每個事務需要在session.close和session.disconnect()被呼叫 
* Nonstrict read/write: 這種策略不保障兩個同時進行的事務會修改同一塊資料,這種策略適用於那些經常讀取但是極少更新的資料 
* Transactional: 這種策略是完全事務化得快取策略,可以用在JTA環境下

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

sorted collection是在記憶體中通過Java比較器進行排序的 
ordered collection是在資料庫中通過order by進行排序的

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

1.讀取並解析配置檔案 
2.讀取並解析對映資訊,建立SessionFactory 
3.開啟Sesssion 
4.建立事務Transation 
5.持久化操作 
6.提交事務 
7.關閉Session 
8.關閉SesstionFactory

為什麼要用: 
1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。

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

  2. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。

  3. hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。

10、Hibernate是如何延遲載入?

當Hibernate在查詢資料的時候,資料並沒有存在與記憶體中,當程式真正對資料的操作時,物件才存在與記憶體中,就實現了延遲載入,他節省了伺服器的記憶體開銷,從而提高了伺服器的效能。

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

類與類之間的關係主要體現在表與表之間的關係進行操作,它們都是對物件進行操作,我們程式中把所有的表與類都對映在一起,它們通過配置檔案中的many-to-one、one-to-many、many-to-many、

12、說下Hibernate的快取機制

  1. 內部快取存在Hibernate中又叫一級快取,屬於應用事物級快取

  2. 二級快取: 
    a) 應用及快取 
    b) 分散式快取 
    條件:資料不會被第三方修改、資料大小在可接受範圍、資料更新頻率低、同一資料被系統頻繁使用、非關鍵資料 
    c) 第三方快取的實現

13、Hibernate的查詢方式

Sql、Criteria,objectcomposition 
Hql: 
1、 屬性查詢 
2、 引數查詢、命名引數查詢 
3、 關聯查詢 
4、 分頁查詢 
5、 統計函式

14、如何優化Hibernate?

1.使用雙向一對多關聯,不使用單向一對多 
2.靈活使用單向一對多關聯 
3.不用一對一,用多對一取代 
4.配置物件快取,不使用集合快取 
5.一對多集合使用Bag,多對多集合使用Set 
6. 繼承類使用顯式多型 
7. 表字段要少,表關聯不要怕多,有二級快取撐腰

15、Hibernate有哪幾種查詢資料的方式

3種:hql、條件查詢QBC(QueryBy Criteria)、原生sql (通過createSQLQuery建立)

16、談談Hibernate中inverse的作用

inverse屬性預設是false,就是說關係的兩端都來維護關係。 
比如Student和Teacher是多對多關係,用一箇中間表TeacherStudent維護。Gp)i 
如果Student這邊inverse=”true”, 那麼關係由另一端Teacher維護,就是說當插入Student時,不會操作TeacherStudent表(中間表)。只有Teacher插入或刪除時才會觸發對中間表的操作。所以兩邊都inverse=”true”是不對的,會導致任何操作都不觸發對中間表的影響;當兩邊都inverse=”false”或預設時,會導致在中間表中插入兩次關係。

17、Detached Object(遊離物件)有什麼好處

Detached Object(遊離物件)可以傳遞到任何層直到表現層而不是用任何DTO(DataTransfer Objects). 然後你還可以重新把遊離物件賦給另外一個Session.

18、JDBC hibernate 和 ibatis 的區別

jdbc:手動 
手動寫sql 
delete、insert、update要將物件的值一個一個取出傳到sql中,不能直接傳入一個物件。 
select:返回的是一個resultset,要從ResultSet中一行一行、一個欄位一個欄位的取出,然後封裝到一個物件中,不直接返回一個物件。 
ibatis的特點:半自動化 
sql要手動寫 
delete、insert、update:直接傳入一個物件 
select:直接返回一個物件 
hibernate:全自動 
不寫sql,自動封裝 
delete、insert、update:直接傳入一個物件 
select:直接返回一個物件

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

1.建索引 
2.減少表之間的關聯 
3.優化sql,儘量讓sql很快定位資料,不要讓sql做全表查詢,應該走索引,把資料量大的表排在前面 
4.簡化查詢欄位,沒用的欄位不要,已經對返回結果的控制,儘量返回少量資料

20、什麼是SessionFactory,她是執行緒安全麼?

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

21、Hibernate的五個核心介面

Configuration 介面:配置Hibernate,根據其啟動hibernate,建立 
SessionFactory 物件; 
SessionFactory 介面:初始化Hibernate,充當資料儲存源的代理,建立 
session 物件,sessionFactory 是執行緒安全的,意味著它的同一個例項可以被應 
用的多個執行緒共享,是重量級、二級快取; 
Session 介面:負責儲存、更新、刪除、載入和查詢物件,是執行緒不安全的, 
避免多個執行緒共享同一個session,是輕量級、一級快取; 
Transaction 介面:管理事務; 
Query 和Criteria 介面:執行資料庫的查詢。