java中Hibernate的狀態總結
在Hibernate框架中對象的存在有不同的狀態,隻有理解瞭這些狀態,才能對Hibernate的工作機制有所認知。主要有四種:瞬時狀態、持久化狀態、脫管狀態和刪除態 。都比較好理解,大致可以看作是臨時、穩定、半穩定、回收的幾種形式,下面就Hibernate的這幾種狀態帶來詳細的介紹。
1.瞬時狀態
通過new開辟內存空間創建的實體對象,但是它沒有納入hibernate session的管理之中,如果沒有變量對它引用,它將會被JVM(垃圾回收器)回收。瞬時狀態的對象在內存中是孤立的,它與數據庫無任何關聯,僅僅是一個信息攜帶的載體。
一個瞬時狀態對象被持久化狀態對象引用,它也會自動變為持久化狀態對象。例如調用session的save、saveorupdate等方法的時候。
特征:
(1)使用 new 創建出來的對象,沒有設置 id 屬性
(2)沒有被 session 托管,換句話說 對象數據 存放在內存中, 沒有存放到 session 緩存中
(3)臨時對象數據 與 數據庫中的數據 還沒任何關聯
2.持久化狀態
持久化狀態對象存在與數據庫中的數據關聯,它總是與會話狀態(Session)和事務(Transaction)關聯在一起。當持久化狀態對象發生變動時並不會立即執行數據庫操作,隻有當事務結束時,才會更新數據庫,以便保證Hibernate的持久化對象和數據庫操作的同步性。
當持久化狀態對象變為托管狀態對象時,它將不在Hibernate持久層的管理范圍之內。
特征:
(1)要麼是從數據庫中使用 get 或 load 方法查詢到的數據對象, 要麼是 使用save 或 update 方法數據轉變成持久層對象
(2)對象 數據被 session 托管。換句話說 對象數據 在 session 緩存中有一份,在數據庫中有相應的記錄
3.脫管狀態
當持久化對象的Session關閉之後,這個對象就從持久化狀態變為托管狀態。托管狀態的對象仍然在與數據庫中的數據關聯,但是他並不在Hibernate的Session管轄范圍之內。
如果將脫管狀態的對象重新關聯到某個新的Session上,它將變回持久化狀態對象。
特征:
(1)主要是通過 持久狀態對象,調用 session.evict() 或 session.clear() 或 session.close() 得到的,也可以new 一個設置 id 值的對象
(2)session 緩存中沒有,內存中有的對象(註: 該對象設置瞭 id 值)
4.刪除態
調用session的delete方法時,對象轉為刪除態。刪除態隻能等待被回收。
知識點擴展:
Hibernate的檢索方式
導航對象圖檢索(根據已經加載的對象,導航到其他對象。)
- OID檢索(按照對象的OID來檢索對象。)
- HQL檢索(使用面向對象的HQL查詢語言。)
- QBC檢索(使用QBC(Qurey By Criteria)API來檢索對象。 QBC/QBE離線/在線)
- 本地SQL檢索(使用本地數據庫的SQL查詢語句。)
包括Hibernate的檢索方式,Hibernate中對象的狀態,Hibernate的3種檢索策略是什麼,分別適用於哪種場合,ORM解決的不匹配問題, Hibernate映射繼承關系的3種方式,Session的find()方法以及Query接口的區別等方面問題的總結
臨時狀態(transient):剛剛用new語句創建,還沒有被持久化,不處於Session的緩存中。處於臨時狀態的Java對象被稱為臨時對象。
持久化狀態(persistent):已經被持久化,加入到Session的緩存中。處於持久化狀態的Java對象被稱為持久化對象。
遊離狀態(detached):已經被持久化,但不再處於Session的緩存中。處於遊離狀態的Java對象被稱為遊離對象。
Hibernate的3種檢索策略是什麼,分別適用於哪種場合
立即檢索
優點:對應用程序完全透明。
缺點:select語句數目多。
適用:類級別。
延遲檢索
優點:由應用程序決定加載哪些對象,可以避免執行多餘的select語句以及避免加載不需要訪問的對象,節省內存空間,提高檢索效率。
缺點:應用程序如果要訪問遊離態的代理類實例,必須保證它在持久化時已經被初始化。
適用:一對多或多對多關聯。應用程序不需要立即訪問或者根本不會訪問的對象。
迫切左外連接檢索
優點:對應用程序完全透明,不管對象處於持久化狀態還是遊離狀態,應用程序都可以方便的從一個對象導航到另一個與它相關聯的對象。使用瞭外連接,select語句數目少。
缺點:可能會加載程序不許要訪問的對象。復雜的數據庫表連接形象檢索性能。
適用:一對一或多對一關聯。應用程序需要立即訪問的對象。數據庫系統具有良好的表連接性能。
到此這篇關於java中Hibernate的狀態總結的文章就介紹到這瞭,更多相關java之Hibernate的狀態整理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- java中Hibernate面試知識點整理
- Java Hibernate中的持久化類和實體類關系
- Java Hibernate中的查詢策略和抓取策略
- java中mybatis和hibernate的用法總結
- 使用jpa的時候set實體類屬性自動持久化的解決方案