1. 程式人生 > >(七)Java對象在Hibernate持久化層的狀態

(七)Java對象在Hibernate持久化層的狀態

不為 true nsa 創建對象 記錄 獲取 生成 對象狀態 uid

一、概述

-臨時狀態:剛用new語句創建對象,還沒有被持久化,並且不處於Session緩存中。處於臨時狀態的java對象被稱為臨時對象。

-持久化狀態:已經被持久化,並且加入到Session的緩存中。處於持久化狀態的java對象被成為持久化對象。

-遊離狀態:已經被持久化,但不再處於Session的緩存中。處於遊離狀態的java對象被成為遊離對象。

臨時對象的特征:
        -OID為null
        -不處於Session的緩存中,也可以說,不被任何一個Session實例關聯
        -在數據庫中沒有對應的記錄

持久化對象的特征:
        -OID不為null
        -位於一個Session實例的緩存中,持久化對象總是被一個Session實例關聯
        -持久化對象和數據庫中的相關記錄對應
        -會根據持久化對象的屬性變化,同步更新數據庫。
            User  user=(User)session.get(User.class,1);//獲取持久化對象 持久狀態
            user.setName("jerry");
            transaction.commit();
        我們發現我們沒有執行update語句,卻打印了update語句。Hibernate會自動將持久化對象的狀態同步到數據庫中。


遊離對象的特征:
        -OID不為null
        -不再位於Session的緩存中,也可以說,遊離對象不被Session關聯
        -數據庫中有對應的記錄 

 

例子:

        //對象狀態轉換的過程
        Transaction ts=session.beginTransaction();
        User user =new User();                  //臨時狀態
         user.setName("tom");
         user.setPassword("123456");

        session.save(user);                     //轉變為持久化狀態
        ts.commit();                            //持久化狀態 

        session.close();                        //轉變為遊離狀態
        sessionfactory.close();
        System.out.println(user.getName());     //遊離狀態 

二、三種狀態的轉換

    1)臨時狀態轉換持久化狀態
        -Session的save()方法會將臨時狀態轉換成持久狀態。
            把要保存的對象放入Session緩存中,使它進入持久化狀態。使用映射文件指定的主鍵生成策略,為持久化對象分配唯一OID。
            save方法只是為對象分配UID。我們可以在save方法處打斷點。
            當我們的主鍵生成策略為native時,由於我們使用mysql數據庫,主鍵自增,所以執行完save方法後,打印insert語句,mysql數據庫為我們對象自增OID 

            當我們的主鍵生成策略為incrementt時,increment是由Hibernate維護,先去表中查最大ID然後+1,我們執行完save方法之後,發現打印select查找最大id的語句,執行commit時才打印插入語句


    2)臨時狀態轉換成遊離狀態
        -將臨時狀態的對象OID設置為數據庫中對應的記錄.
        User user=new User();
        user.setId(1);

    3)持久化狀態轉換成臨時狀態
        第一種:
            User  user=(User)session.get(User.class,1);//獲取持久化對象 持久狀態
            session.close(); //遊離狀態
            user.setId(null);//臨時狀態 
        第二種:
            User  user=(User)session.get(User.class,1);//獲取持久化對象 持久狀態
            session.evict(user); //遊離狀態,此方法會將session緩存中清除持久化對象,使其變為遊離狀態
            user.setId(null);//臨時狀態  

    4)持久化狀態轉換成遊離狀態
        第一:調用session的close方法,持久化狀態變為遊離狀態
        第二: 調用session的evict()方法方法,將持久狀態轉變為遊離狀態


    5)遊離狀態轉換成臨時狀態
        只需要將遊離狀態的對象OID變為null。

    6)遊離狀態轉換成持久狀態
        Session的update()方法使遊離狀態轉換成持久狀態。
            User  user=(User)session.get(User.class,1);//獲取持久化對象 持久狀態
            session.evict(user); //遊離狀態,此方法會將session緩存中清除持久化對象,使其變為遊離狀態
            session.update(user);

  

  

 

(七)Java對象在Hibernate持久化層的狀態