Hibernate常見面試題


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

 Hibernate並發機制:

 a、Hibernate的Session對象是非線程安全的,對於單個請求,單個會話,單個的工作單元(即單個事務,單個線程),它通常只使用一次,  然后就丟棄。 

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

     如果在Http Session中有hibernate的Session的話,就可能會出現同步訪問Http Session。只要用戶足夠快的點擊瀏覽器的“刷新”,  就會導致兩個並發運行的線程使用同一個Session。  
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), 此時,數據庫中沒有與之對應的記錄。

 請參見:http://itindex.net/detail/40384-hibernate-%E9%9D%A2%E8%AF%95


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM