hibernate中對象狀態

wKioL1d867LSDyBxAADlPZpcqRI528.png

對象的狀態

  臨時狀態

      new出的對象

  持久化狀態

      get,save,update

  脫管狀態

      clear  close  evict  

wKiom1d869yh1AO_AABikn1kbuM598.png



session.get方法取出一個持久化對象,同時產生這個對象的快照,如何判斷何時對該對象進行update操作?將快照和該對象進行對比,當快照值和對象值不一致的時候,發出update語句,否則不發。

 

主鍵生成器改爲identity

session.save(person);

session.evict(person);

transaction.commit();

session執行save操作時候,就發出了insert語句。執行evict操作時候,person對象轉爲爲託管狀態。事務提交,因爲已經發出過了insert語句了,person雖然爲託管狀態,但是不影響事務的提交,所有和數據庫發生了交互。

import org.hibernate.Session;    
    import org.hibernate.Transaction;
    import org.junit.Test;
     
    import cn.itcat.domain.ConfigUtil;
    import cn.itcat.domain.Person;
     
    public class StateTest extends ConfigUtil{
    /**
     * session.save方法把一個臨時狀態的對象轉化成持久化狀態的對象
     */
    @Test
    public void testSavePerson(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = new Person();
    person.setPname("afds");
    person.setPsex("af");
    session.save(person);
    transaction.commit();
    session.close();
    }
    /**
     * session.update方法可以把一個對象的狀態變成持久化狀態
     */
    @Test
    public void testUpdate(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person2 = new Person();//臨時狀態
    person2.setPid(1L);//臨時狀態
    session.update(person2);//updat方法是將一個臨時狀態的對象轉化爲持久化狀態對象
    transaction.commit();//發出sql語句
    session.close();
    }
    /**
     * 當session.get方法得到一個對象的時候,是不需要再執行 update語句,因爲已經是持久化狀態
     * 當一個對象是一個持久化對象的時候,當進行提交的時候,hibernate內部會讓該對象和快照進行對比,如果一樣,則不發出update語句
     * 如果不一樣,則發出update語句
     */
    @Test
    public void testGet(){
    Session session = sessionFactory.openSession();
    //Transaction transaction = session.beginTransaction();
    Person person = (Person)session.get(Person.class, 1L);//get取出的對象就是一個持久化對象
    person.setPname("tt");
    //session.update(person); 
    //transaction.commit();
    session.close();
    }
    /**
     * session.clear方法把所有的對象從session中清空
     */
    @Test
    public void testClear(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = (Person)session.get(Person.class, 1L);
    person.setPname("asd");
    session.clear();//把session中所有的對象清空
    session.update(person);//把對象從脫管狀態轉化成持久化狀態
    transaction.commit();
    session.close();
    }
    /**
     * session.evict把一個對象從session中清空
     */
    @Test
    public void testEvict(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = (Person)session.get(Person.class, 1L);
    person.setPname("asdsss");
    session.evict(person);//脫管狀態
    session.update(person);//把對象的狀態轉化成持久化狀態
    transaction.commit();
    session.close();
    }
    /**
     * 一個對象是否是持久化對象是針對某一個session而言的
     */
    @Test
    public void testSession(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = (Person)session.get(Person.class, 1L);
    person.setPname("asfd");
    transaction.commit();
    session.close();
    session =  sessionFactory.openSession();
    transaction =  session.beginTransaction();
    person.setPname("aaaaaaa");//person對象對於94的session來說是一個臨時狀態的對象
    //session.update(person);
    transaction.commit();
    session.close();
    }
    /**
     * 當執行transaction.commit的時候,hibernate內部會檢查session
     *    1、如果一個對象爲臨時狀態的對象,則session不會管
     *    2、如果一個對象是持久化狀態的對象,如果有ID值,並且和數據庫對應,那麼先把該對象與快照進行對比,如果一致,則什麼都不做,如果不一致,則發出update語句
     *    3、如果一個對象是持久化狀態的對象,如果沒有ID值,則會發出save語句
     */
    @Test
    public void testMuplyOption(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = new Person();
    person.setPname("rrr");
    person.setPsex("asdfasdf");
    Person person3 = new Person();
    person3.setPname("rrr");
    person3.setPsex("asdfasdf");
    session.save(person);
    Person person2 = (Person)session.get(Person.class, 1L);
    person2.setPname("afds45");
    transaction.commit();
    session.close();
    }
    @Test
    public void testMutiplyOption2(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = new Person();
    person.setPname("asdfads");
    person.setPsex("er");
    session.save(person);
    transaction.commit();
    session.evict(person);
    session.close();
    session = sessionFactory.openSession();
    transaction = session.beginTransaction();
    session.update(person);
    session.clear();
    transaction.commit();
    session.close();
    }
    @Test
    public void testTransaction(){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Person person = (Person) session.get(Person.class, 1L);//這個person在 第一個事務之中
    person.setPname("11"); //person在第一個session的事務中
    session =sessionFactory.openSession();//這是第二個session,如果把這個session給註釋了,那麼第一個session開啓了兩個事務,即使第一個事務不提交,第二個事務提交,仍然可以和數據庫發生交互,因爲這兩個事務都在同一個session中
    Transaction transaction2 = session.beginTransaction();
    person.setPname("22"); //person在第一個session的事務中
    transaction2.commit();
    //transaction.commit();//第一個session的事務不提交,不會和數據庫發生交互
    session.close();
           }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章