在Hibernate中,對象有三種狀態(tài):臨時狀態(tài)、持久狀態(tài)和游離狀態(tài)。
臨時狀態(tài):當new一個實體對象后,這個對象處于臨時狀態(tài),即這個對象只是一個保存臨時數(shù)據(jù)的內(nèi)存區(qū)域,如果沒有變量引用這個對象,則會被jre垃圾回收機制回收。這個對象所保存的數(shù)據(jù)與數(shù)據(jù)庫沒有任何關系,除非通過Session的save或者SaveOrUpdate把臨時對象與數(shù)據(jù)庫關聯(lián),并把數(shù)據(jù)插入或者更新到數(shù)據(jù)庫,這個對象才轉換為持久對象。
例如:Emp e=new Emp(); //創(chuàng)建臨時對象
e.setEmpno((long) 8888);
e.setEName("mike");
...
EmpDAO d=new EmpDAO();
d.save(e);//持久化
...
持久狀態(tài): 持久化對象的實例在數(shù)據(jù)庫中有對應的記錄,并擁有一個持久化表示(ID)。對持久化對象進行delete操作后,數(shù)據(jù)庫中對應的記錄將被刪除,那么持久化對象與數(shù)據(jù)庫記錄不再存在對應關系,持久化對象變成臨時狀態(tài)。
持久化對象被修改變更后,不會馬上同步到數(shù)據(jù)庫,直到數(shù)據(jù)庫事務提交。在同步之前,持久化對象是臟的(Dirty)。
例如:
Emp e=new Emp(); //創(chuàng)建了臨時的對象
EmpDAO edao= new empDAO();
e=edao.findbyEmpno((long) 7786); //使對象與數(shù)據(jù)庫記錄對應,從而持久化
e.setEname("新的名字"); //修改了持久化對象,使之處于 Dirty
......
edao.saveorupdate(e); //保存,但是仍然 Dirty
tran.commit(); //提交,實現(xiàn)與數(shù)據(jù)庫同步,不再Dirty
......
游離狀態(tài):當Session進行了Close、Clear或者evict后,持久化對象雖然擁有持久化標識符和與數(shù)據(jù)庫對應記錄一致的值,但是因為會話已經(jīng)消失,對象不在持久化管理之內(nèi),所以處于游離狀態(tài)(也叫:脫管狀態(tài))。游離狀態(tài)的對象與臨時狀態(tài)對象是十分相似的,只是它還含有持久化標識。
其中,持久化狀態(tài)的對象,簡稱為:PO
而臨時狀態(tài)和游離狀態(tài)的對象,簡稱為:VO
1、通過get()或load()方法得到的實例都是持久化狀態(tài)的。
2、當把session關閉時,session緩存中的持久化對象也變成游離態(tài)
因關閉session而變成游離態(tài)的可以通過lock、save、update變成持久態(tài)
3、持久態(tài)實例可以通過調(diào)用delete()變成游離態(tài)
而游離狀態(tài)的實例可以通過調(diào)用lock()或者replicate()進行持久化
4、save()和persist()將會引發(fā)SQL的insert,delete()會引發(fā)SQL的delete
update()或merge()會引發(fā)SQL的update,對持久化實例的修改在刷新提交的時候會
被檢測到, 它會引發(fā)SQL的update
saveOrUpdate()或者replicate ()會引發(fā)SQL的insert或者update
posted on 2010-08-16 09:59
David1228 閱讀(331)
評論(0) 編輯 收藏 所屬分類:
Hibernate/ibatis