標籤:hibernate java
通過前幾篇部落格的大概介紹,我們發現hibernate將業務實體持久化到資料庫的工作原理的實現,是通過“映射xml”來銜接的。那麼這個xml的由來是哪?
對應檔(hbm)合理的存在的前提就是“有與之對應的實體的存在”——業務實體。
今天這篇部落格就來說說實體到資料庫的過程,這是一個從代碼到資料的持久化過程,就是hibernate實現ORM持久化的生命週期。
一、持久化對象生命週期
是hibernate持久化的一個狀態圖,可以看出,ORM這個過程經曆了三個狀態:transient,Persistent,Detached。
首先來理解一下 實體物件的三種狀態:Transient object ,persist object,detached object包含的資訊:
1、Transient Object(臨時對象):很明顯圖中,在起點位置:我們New 了一個對象,進入了Transient 狀態。也就是說:使用new 操作符初始化的對象不是立即就持久化的,它們的狀態是瞬時的,它們沒有任何跟資料庫表相關的行為,那麼只要程式不再調用這些對象,它們的狀態就會丟失,並且由記憶體回收機制回收。
程式碼範例:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//建立一個瞬態對象 User user = new User(); user.setName(userName); user.setPassword("test"); //user仍是一個瞬態對象</span>
2、Persist Object(持久化對象):持久執行個體是任何具有資料庫標識的執行個體。它被持久化管理器session統一管理,持久執行個體是在事務中進行操作的————它們的狀態在事務結束時同資料庫進行同步,當事務提交時,通過執行SQL的insert,update,和delete語句把記憶體中的狀態同步到資料庫中。
代碼執行個體:
//建立一個瞬態對象User user = new User();user.setName(userName);user.setPassword("test");//user仍是一個瞬態對象Session session = sessionFactory.openSession();Tansaction tx = session.beginTansaction();//此時user仍是一個瞬態對象session.save(user);//此時user已變為持久態
3、Detached Object(離線對象):session關閉之後,持久化對象就變為離線對象,離線表示這個對象不能再與資料庫保持同步,不再受hibernate的管理。
程式碼範例:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//建立一個瞬態對象 User user = new User(); user.setName(userName); user.setPassword("test"); //user仍是一個瞬態對象 Session session = sessionFactory.openSession(); Tansaction tx = session.beginTansaction(); //此時user仍是一個瞬態對象 session.save(user); //此時user已變為持久態 tx.commit(); session.close(); // clear() evict() 3種變游離態 user對象已經變成游離態</span>
注意:
ORM的過程中,區分三態的標誌就是“是否被Session”管理。
Transient ,detached的狀態都不被session管理,只有persistent被session管理,注意這裡的session是hibernate的session,不是http中使用者會話的session。實體物件處於Hibernate架構所管理的狀態,也就是說這個實體物件與session對象的執行個體相關,對這個實體所做的任何變更操作都將被Hibernate持久化到資料庫層。
通過這個表格來說明三種狀態的區別:
二、hibernate三態之間的相互轉換
還是這副圖,大家看看圖中的箭頭,三種狀態之間是可以相互轉換的。
圖中,三態之間的轉換有兩種:
1、進入session,藍色的箭頭,被session管理。
三個口:transient ,detached,transient之前。
操作方法:修改:save ,saveorupdate ,lock;這樣不論是在transient,還是detached都可以轉換成 persistent狀態。
查詢:get,load,find,iterator()。
2、出session,紅色箭頭不被session管理。
一個口:persistent 。
方法:evict,close,clear,delete。
三、persistent 特殊說明
1、直接調用到persistent。
以上說明中,有一個特例就是:查詢:get,load,find,iterator()。所以hibernate的三態生命週期不包含查詢性質的操作,圖中明顯可以看到查詢語句從是可以從程式中,直接調用到persistent的。查詢只跟persistent相關。
從一個執行個體中來說明:
Session session = sessionFactory.openSession();Tansaction tx = session.beginTansaction();User user = (User) session.load(User.class,"key"); ------相當於hql 從DB讀出來的 當然是持久態//user對象已是持久太對象tx.commit();session.close();
2、在persistent自動更新
第一點說的是直接調到persistent,這裡說的是通過transitent,進入persistent後,進行的自動更新。看代碼如下:
//建立一個瞬態對象 User user = new User(); user.setName(userName); user.setPassword("test"); //user仍是一個瞬態對象Session session = sessionFactory.openSession();Tansaction tx = session.beginTansaction();//此時user仍是一個瞬態對象session.save(user);//此時user已變為持久態tx.commit();//persistent自動更新代碼Tansaction tx2 = session.beginTansaction();user.setPassword("pdw");tx2.commit();//雖然在這個事物中並沒有調用session的save()方法來儲存user對象,但是usr處於持久太,//所以對user對象所做的任何修改都持久化到資料庫中 ---------持久態自動更新//那麼資料庫中的密碼也變成了pdw session.close();
當user進入persistent後,我們可以直接對其進行set操作,因為本來就處在persistent,所以不用通過“save"或者“saveorupdate"來再次進入persistent。這就好比,我們買了遊樂園的通票去遊玩,只要進去了,就可以玩每個項目,不用每玩一個項目再出去買票了。
這就是操作hibernate對象持久化到資料庫的一個流程,三個狀態,一個生命週期,狀態之間的相互轉換,他們都是遵循一定的“事物發展規律”。
本篇部落格只是粗顯地介紹了基礎,是我們開發必須要知道瞭解的使用者手冊的一部分。當然還有API,詳細的記錄了hibernate包含的方法,特性,這裡就不在一一介紹,這些僅僅是入門,上手,還是需要多多的練習。
Hibernate持久化生命週期——三態