在Hibernate中,持久化對象再被操作過程中分為三個時期.這三個時期和session周期相關.
狀態圖描述一個對象在不同、各自是瞬時(Transient),持久太(persistent)和游離態(Detached)
瞬時狀態
由new命令開辟內存的java對象.比如:Student stu= newStudent();若沒有變量對他引用,則被jvm回收.瞬時對象在內存中孤立存在,他的意義僅是攜帶信息的載體,不和數據庫中的數據有不論什么的關聯。通過session的save()和saveOrUpdate()方法能夠把一個瞬時對象與數據庫相關聯,并把瞬時對象攜帶的信息通過配置文件所做的映射插入到數據庫中,這個瞬時對象就成了持久化對象,擁有和數據庫記錄同樣的id標示(Hibernate自己主動將id賦予它)?
? ?瞬時特點:
??? (1)不和Session實例關聯
??? (2)在數據庫中沒有和瞬時對象關聯的記錄
持久態?
持久的實例在數據庫中有相應的記錄.是Session和Transction相關聯.在sessin中,持久對象改變不會立即對數據變更.而必須在Transcation終止,commit后,才與數據庫進行同步.在此之前的持久太對象為臟對象.?
使用 find,get ,load和iterater等方法查詢的數據,都是持久對象.若一個瞬時對象被持久對象引用,則該對象也會變為持久對象.?
?假設使用delete()方法,它就會變為瞬時對象;當一個Session運行close()或clear()、evict()之后,持久對象就會變為托管對象。?
??? 持久特點:
??? (1)和Session實例關聯
??? (2)在數據庫中有和持久對象關聯的記錄?
代碼演示樣例:public void testSave(){Session session =null;Transaction tx=null ;try{session= HibernateUtils.getSesion();tx =session.beginTransaction();//transient 瞬時狀態User user= new User();user.setName("sdf");user.setPassword("hanhan23");user.setCreateTime(new Date());//persistent, ,session引用,po持久session.save(user); //被引用,成為持久狀態//可是為臟對象user.setName("lisd");tx.commit();//}catch(Exception e){e.printStackTrace();tx.rollback();}finally{HibernateUtils.closeSession(session);}//deteached狀態關閉sesion后}
以上演示樣例演示瞬時態轉為持久態對象
?托管狀態
????? 與持久對象關聯的Session被關閉后,對象變為托管。對托管對象的引用依舊有效,對象可繼續被修改。托管對象假設又一次關聯到某個新的Session上,會再次轉變為持久的。托管狀態期間的修改將會被持久化到數據庫。
???? 托管狀態擁有數據庫標識id,所以它能夠通過update()、saveOrUpdate()和lock()等方法,再度與持久層關聯。
???? 托管特點:
???? (1)本質上和瞬時對象同樣
???? (2)僅僅是比瞬時對象多了一個數據庫記錄標識值id
小結:
通過以上三種的對照,認識到,Hibernate中的對象是在session的管理進行數據的持久更新.狀態之間的轉換是與對象的生命周期息息相關.剛創建的內存中為游離態,若一旦被session保存為持久態(或被session引用).一旦sesion關閉或delete變為托管.學習之初,還請多多提意見.