hibernate對象三種狀態


hibernate里對象有三種狀態:

1,Transient 瞬時 :對象剛new出來,還沒設id,設了其他值。

2,Persistent 持久:調用了save()、saveOrUpdate(),就變成Persistent,有id

3,Detached  脫管 : 當session  close()完之后,變成Detached。

例子程序:

Teacher類:

 1 package com.oracle.hibernate.id;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.GeneratedValue;
 5 import javax.persistence.Id;
 6 
 7 @Entity
 8 public class Teacher {
 9 
10     
11     
12     private int id;
13     private String name;
14     
15     private String title;
16 
17     @Id
18     @GeneratedValue
19     public int getId() {
20         return id;
21     }
22 
23     public void setId(int id) {
24         this.id = id;
25     }
26 
27     public String getName() {
28         return name;
29     }
30 
31     public void setName(String name) {
32         this.name = name;
33     }
34 
35     public String getTitle() {
36         return title;
37     }
38 
39     public void setTitle(String title) {
40         this.title = title;
41     }
42     
43     
44 }
View Code

測試類:

package com.oracle.hibernate.id;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class HibernateCoreAPITest {

    private static SessionFactory sf = null;

    @BeforeClass
    public static void beforeClass() {
        // try-chatch是為了解決Junit有錯誤不提示的bug
        try {

            sf = new AnnotationConfiguration().configure()
                    .buildSessionFactory();
        } catch (HibernateException e) {

            e.printStackTrace();
        }
    }

    @Test
    public void testTeacher() {

        Teacher t = new Teacher();
        // 沒有設id
        t.setName("li");
        t.setTitle("high");
        // 執行到此時,狀態為transient。

        // 在內存中有一個session對象,
        Session session = sf.getCurrentSession();

        session.beginTransaction();
        // save后變成persistent
        session.save(t);

        // 打印出id
        System.out.println(t.getId());
        // commit后自動close session,變成detached狀態
        session.getTransaction().commit();

    }

    @AfterClass
    public static void afterClass() {
        sf.close();
    }

}
View Code

代碼詳細解讀,內存分析:

1,當Theacher   t  = new  Teacher(); t.setXXX后,此時的t是沒有id的,只是在內存中有了一個Teacher對象t。此時狀態就是transient。

2,當執行Session session = sf.getCurrentSession();內存中會有一個Session對象,session對象里有一個hashmap,他其實就是緩存:內存中的一塊區域,放着一系列想要的提高讀取效率的對象(的引用)。這個HashMap的key,是用來保存將要持久化的對象的id,value保存我們的對象,在這里就是t,其實是保存對象的引用,指向t對象。這都是准備工作,沒有調用save方法,里邊什么都沒有。當執行了session.save(t);就在session的緩存里就有了t對象,key里有了id 1,value指向t對象。調用save方法的同時,會發出insert語句,在數據里也就有了t對象。

所以save完之后,內存里有t對象,數據庫里也有t對象,稱為persistent狀態。

這樣做的好處是:

提高效率,如果要找id=1的對象,直接從內存里去查,而不用去數據庫里找。

3,當執行了session.getTransaction().commit();session自動關了,session對象沒有了,緩存也沒了。看圖可知,此時t對象在內存中還有,只是HashMap指向t沒了。t對象已經脫離了session的管理,稱為detached  脫管狀態。

總結:

hibernate對象三種狀態的區分關鍵在於:

  a)有沒有id

  b)id在數據庫中有沒有

  c)在內存中有沒有(session緩存)

三種狀態:

  a) transient :內存中一個對象,沒id,緩存中也沒有

  b)persistent:內存中有對象,緩存中有,數據庫中有(id)

  c)detachd:內存有對象,緩存沒有,數據庫有

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM