1. 程式人生 > >Hibernate學習-11:持久化物件狀態及狀態轉換、持久態物件自動更新資料庫

Hibernate學習-11:持久化物件狀態及狀態轉換、持久態物件自動更新資料庫

持久化類:就是一個實體類 與 資料庫表建立了對映.

Hibernate為了方便管理持久化類,將持久化類分成了三種狀態.

瞬時態 transient  :(臨時態)特點:持久化物件沒有唯一標識OID.沒有納入Session的管理

持久態 persistent :特點:持久化物件有唯一標識OID.已經納入到Session的管理

脫管態 detached   :(離線態)特點:持久化物件有唯一標識OID,沒有納入到Session管理

1、區分三種持久化物件的狀態

請看下面的例子:

@Test
	// 區分持久化物件的三種狀態:
	public void demo1(){
		// 1.建立Session
		Session session = HibernateUtils.openSession();
		// 2.開啟事務
		Transaction tx = session.beginTransaction();
		
		// 向資料庫中儲存一本圖書:
		Book book = new Book();	// 瞬時態:沒有唯一標識OID,沒有與session關聯.
		book.setName("Hiernate開發");
		book.setAuthor("孫XX");
		book.setPrice(65d);
		
		session.save(book); // 持久態:有唯一標識OID,與session關聯.
		
		// 3.事務提交
		tx.commit();
		// 4.釋放資源
		session.close();
		
		book.setName("Struts2開發"); // 脫管態:有唯一的標識,沒有與session關聯.
	}

2、三種狀態物件轉換:

瞬時態:

獲得:

Book book = new Book();

瞬時——>持久

save(book);
save()/saveOrUpdate();

瞬時態——>脫管

book.setId(1);

持久態:

獲得:

Book book = (Book)session.get(Book.class,1);
get()/load()/find()/iterate();

持久態——>瞬時態:

delete(book);
***特殊狀態:刪除態.(被刪除的物件,不建議去使用.)

持久態——>脫管態:

session.close();
close()/clear()/evict();

脫管態:

獲得:

Book book = new Book();
book.setId(1);

脫管態——>持久態:

session.update();
update()/saveOrUpdate()/lock()

脫管態——>瞬時態:

book.setId(null);

持久態物件有自動更新資料庫的能力,例如:
@Test
	// 測試持久態的物件自動更新資料庫
	public void demo2(){
		// 1.建立Session
		Session session = HibernateUtils.openSession();
		// 2.開啟事務
		Transaction tx = session.beginTransaction();
		
		// 獲得一個持久態的物件.
		Book book = (Book) session.get(Book.class, 1);
		book.setName("Struts2開發");
		
		// session.update(book);
		
		// 3.提交事務
		tx.commit();
		// 4.關閉資源
		session.close();
	}

****** 自動更新資料庫的能力依賴了Hibernate的一級快取.稍後會給大家介紹一級快取和二級快取的相關內容。