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

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

更新 映射 並且 uid com 保存 col AC 語句

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

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

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

     //對象狀態轉換的過程
        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()); //遊離狀態
臨時對象的特征:
        -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關聯
        -數據庫中有對應的記錄 

三種狀態的轉換

    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持久化層的狀態