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 }
測試類:

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(); } }
代碼詳細解讀,內存分析:
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:內存有對象,緩存沒有,數據庫有