1. 程式人生 > >Hibernate-----物件三種狀態

Hibernate-----物件三種狀態

       瞬時態(臨時態):transient,session沒有快取物件,資料庫也沒有對應記錄。

                                    1.沒有與Hibernate產生關聯.  2.與資料庫中的記錄沒有產生關聯(有關聯就是與資料庫中的id有對應).

                                    OID特點:沒有值

       持久態:persistent,session快取物件,資料庫最終會有記錄。(事務沒有提交)

                                   OID特點:有值

       遊離態(託管態):detached,session沒有快取物件,資料庫有記錄。

.                                 1.沒有與Hibernate產生關聯               2.物件有ID

                                 OID特點:有值

 



package com.itheima.a_state;

import org.hibernate.Session;
import org.junit.Test;

import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//物件的三種狀態
public class Demo1 {
    @Test
    //演示三種狀態
    public void fun1(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u = new User();    // 瞬時狀態
        u.setName("tom");        // 瞬時狀態
        u.setPassword("1234");    // 瞬時狀態
        
        session.save(u);        // 持久狀態
                                    //問題: 呼叫完save方法,資料庫中有沒有對應記錄?
                                    // 沒有對應記錄, 但是最終會被同步到資料庫中.仍然是持久狀態.
        //------------------------------------------------
        session.getTransaction().commit(); // 持久狀態
        session.close(); // 遊離狀態
    }
    
    @Test
    //三種狀態的轉換
    // 瞬時 => 持久
    public void fun2(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u = new User();    // 瞬時狀態
        u.setName("tom");        // 瞬時狀態
        u.setPassword("1234");    // 瞬時狀態
        
        session.save(u);        // 持久狀態   save方法會使用主鍵生成策略,為User指定id. => 
                                                                    //主鍵自增 => 列印 insert語句
                                                                    // increment=> select max(id) ....
                                                                    //assigned => 需要手動指定主鍵,不指定將會報錯

//------------------------------------------------  
        session.getTransaction().commit(); // 持久狀態
                                    //事務提交時,會把持久化狀態物件同步到資料庫中
        session.close(); // 遊離狀態
    }
    
    // 瞬時=> 遊離
    // 瞬時: 沒有關聯,沒有id
    // 遊離: 沒有關聯,有id(與資料庫中對應的id)
    @Test
    public void fun3(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
        User u = new User();    // 瞬時狀態
        
        u.setId(1);    //遊離
        
        //----------------------------------------------------
        session.getTransaction().commit(); // 持久狀態
                                    //事務提交時,會把持久化狀態物件同步到資料庫中
        session.close(); // 遊離狀態
    }

 


    @Test
    // 持久=> 瞬時
    // 持久: 有關聯,有id
    // 瞬時: 無關聯,無id
    public void fun4(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通過get方法,得到持久狀態物件
        User u= (User) session.get(User.class, 1); // 持久狀態
        
        //----------------------------------------------------
        session.getTransaction().commit(); // 持久狀態
                                    //事務提交時,會把持久化狀態物件同步到資料庫中
        session.close(); // 遊離狀態
        u.setId(null);//瞬時狀態
    }
    @Test
    // 持久=> 瞬時
    // 持久: 有關聯,有id
    // 瞬時: 無關聯,無id
    public void fun5(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通過get方法,得到持久狀態物件
        User u= (User) session.get(User.class, 1); // 持久狀態
        session.evict(u);//將User物件與session的關聯移除
        u.setId(null);//瞬時狀態
        
session.save(u);//持久狀態
        //----------------------------------------------------
        session.getTransaction().commit(); // 持久狀態
                                    //事務提交時,會把持久化狀態物件同步到資料庫中
        session.close(); // 遊離狀態
    }


        // 持久=> 遊離
    @Test
    // 持久=> 遊離
    // 只需要將session的關聯取消
    public void fun6(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通過get方法,得到持久狀態物件
        User u= (User) session.get(User.class, 1); // 持久狀態
        
        session.evict(u);//遊離
        //----------------------------------------------------
        session.getTransaction().commit(); // 遊離狀態
        session.close(); // 遊離狀態
    }
        
    @Test
    // 遊離=> 瞬時
    // 移除ID 
    public void fun7(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通過get方法,得到持久狀態物件
        User u= (User) session.get(User.class, 1); // 持久狀態
        session.evict(u);//遊離
        u.setId(null);// 瞬時
        //----------------------------------------------------
        session.getTransaction().commit(); // 瞬時狀態
        session.close(); // 瞬時狀態
    }


    @Test
        // 遊離=> 持久
        // 是否與Session關聯
    public void fun8(){
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //------------------------------------------------
            //通過get方法,得到持久狀態物件
        User u= (User) session.get(User.class, 1); // 持久狀態     
        session.evict(u);//遊離
        session.update(u);//持久
        //----------------------------------------------------
        session.getTransaction().commit(); // 持久狀態 -> 列印update語句
        session.close(); // 瞬時狀態
    }



 //三種狀態有什麼用?
    // 持久狀態,我們使用Hibernate主要是為了持久化我們的資料.
    // 對於物件的狀態,我們期望我們需要同步到資料庫的資料,都被裝換成持久狀態
    //持久化狀態特點: Hibernate會自動將持久化狀態物件的變化同步到資料庫中.


    @Test
    // 遊離=> 持久
    // 是否與Session關聯
public void fun9(){
    Session session = HibernateUtils.openSession();
    session.beginTransaction();
    //------------------------------------------------
        //通過get方法,得到持久狀態物件
    User u= (User) session.get(User.class, 1); // 持久狀態 
    //u.setName("jerry");//        為持久狀態
    u.setId(3);//與session建立關聯的物件的ID,不允許修改. -------------  報錯
    
    session.update(u);// 多餘=> 因為Hibernate會自動將持久化狀態物件的變化同步到資料庫中.
    //----------------------------------------------------
    session.getTransaction().commit(); // 持久狀態 -> 列印update語句
    session.close(); // 瞬時狀態
}
    
    
}