1. 程式人生 > >持久化物件三種狀態之間的轉換

持久化物件三種狀態之間的轉換

1.Hibernate持久化物件的三種狀態總結:

    1.瞬態:使用new剛建立的並且還未與Hibernate Session關聯的物件此時處於瞬態。瞬態物件還不會與資料庫之間進行關聯

    2.持久化:持久化例項在資料庫中有對應的記錄,持久化例項可以是剛儲存的,也可以是剛被載入的

    3.脫管:曾經處於持久化狀態,隨著關聯的Session被關閉之後,該物件就變成了脫管狀態

2.瞬態->持久化狀態

    Serializable save(Object obj):將obj物件變為持久化狀態,該物件的屬性將被儲存到資料庫
    void perssist(Object
obj):作用同上 Serializable save(Object obj,Object pk):將obj物件變成持久化狀態,儲存到資料庫時,指定主鍵值 void perssist(Object obj,Object ph):作用同上

上面的指定主鍵值的方法用於持久化物件的標識屬性型別為assigned型別屬性或為複合屬性,這就需要手動設定主鍵值
save()方法和perssist()的區別在於:save()返回該持久化物件的標識屬性值,也就是對應記錄的主鍵值;而perssist()沒有任何返回值;這樣一來save方法就需要立即返回持久化物件的標識屬性值,所以執行save方法會立即將持久化物件對應的資料插入到資料庫,而perssist方法則不會被立即轉換成insert語句

3.根據主鍵載入持久化實體

    1.load():News n = session.load(News.class,pk);
    2.get():News n = session.get(News.class,pk);

兩個方法的區別在於:load具有延遲載入功能,不會立即訪問資料庫,而是先返回一個未初始化的代理物件,只有當程式呼叫該代理物件的某個方法時,Hibernate才會去訪問資料庫;而get總是立即訪問資料庫。當試圖載入的記錄不存在時,load會返回一個未初始化的代理物件,而get直接返回null

4.更新持久化實體

    session.flush();//生成一條Update語句,where pk=pkvalue
    //如下例項:
        News n = session.load
(News.class,pk1) ; n.setTitle("easy hibernate code") ; session.flush() ;

5.脫管->持久化狀態
之前說持久化狀態關聯對應的session被關閉之後,持久化物件就處於了脫管狀態,Hibernate提供了update()、merge()、updateOrSave()來將其重新變成持久化狀態,主要用於儲存修改。如下

    News n = fsession.load(News.class,id) ;
    fsession.close() ;
    n.setTitle("easy hibernate code") ;
    Session Ssession = ...
    Ssession.update(n) ;

update():儲存程式對持久化物件所做的修改
updateOrSave():如果曾經持久化過,則update,否則save
merge():儲存程式對持久化物件所做的修改
merge()和save()方法區別在於:merge()不會持久化給定的物件,如:merge(a);a不會變成持久化狀態,只是a修改的操作會被儲存而已,a仍然處於脫管狀態,因為merge返回值為a物件的副本,該副本處於持久化裝填,也就是說merge返回值為與a同類型的型別;而save()返回值為void,會儲存修改,也會是a變成持久化狀態

6.刪除持久化實體

News n = session.load(News.class,pk) ;
//該持久化例項對應的資料記錄將從資料庫表中刪除
session.delete(n) ;