Hibernate 持久化物件的狀態

Kunaly發表於2018-02-06

什麼是持久化類

1. 持久化類:就是一個Java類(我們們編寫的JavaBean),這個Java類與表建立了對映關係就可以成為是持久化類。
* 持久化類 = JavaBean + xxx.hbm.xml

持久化類的編寫規則

1. 提供一個無引數 public訪問控制符的構造器 -- 底層需要進行反射.
2. 提供一個標識屬性,對映資料表主鍵欄位 -- 唯一標識OID.資料庫中通過主鍵.Java物件通過地址確定物件.持久化類通過唯一標識    OID確定記錄
3. 所有屬性提供public訪問控制符的 set或者get 方法
4. 標識屬性應儘量使用基本資料型別的包裝型別

Hibernate 持久化物件的狀態

1. Hibernate的持久化類
* 持久化類:Java類與資料庫的某個表建立了對映關係.這個類就稱為是持久化類.
* 持久化類 = Java類 + hbm的配置檔案
2. Hibernate的持久化類的狀態
* Hibernate為了管理持久化類:將持久化類分成了三個狀態
* 瞬時態:Transient Object
* 沒有持久化標識OID, 沒有被納入到Session物件的管理.
* 持久態:Persistent Object
* 有持久化標識OID,已經被納入到Session物件的管理.
* 脫管態:Detached Object
* 有持久化標識OID,沒有被納入到Session物件的管理.

Hibernate 持久化物件的狀態的轉換

1. 瞬時態 -- 沒有持久化標識OID, 沒有被納入到Session物件的管理
* 獲得瞬時態的物件
* User user = new User()
* 瞬時態物件轉換持久態
* save()/saveOrUpdate();
* 瞬時態物件轉換成脫管態
* user.setId(1)
2. 持久態 -- 有持久化標識OID,已經被納入到Session物件的管理
* 獲得持久態的物件
* get()/load();
* 持久態轉換成瞬時態物件
* delete(); --- 比較有爭議的,進入特殊的狀態(刪除態:Hibernate中不建議使用的)
* 持久態物件轉成脫管態物件
* session的close()/evict()/clear();
3. 脫管態 -- 有持久化標識OID,沒有被納入到Session物件的管理
* 獲得託管態物件:不建議直接獲得脫管態的物件.
* User user = new User();
* user.setId(1);
* 脫管態物件轉換成持久態物件
* update();/saveOrUpdate()/lock();
* 脫管態物件轉換成瞬時態物件
* user.setId(null);
4. 注意:持久態物件有自動更新資料庫的能力!!!



程式碼示例:

package com.kunaly.test;

import java.io.Serializable;

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

import com.kunaly.domain.User;
import com.kunaly.utils.HibernateUtils;

/**
 * 持久化物件的三種狀態
 * @author Administrator
 *
 */
public class Demo03 {
	
	@Test
	public void run1() {
        // 獲取session
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		
		// 持久User的物件
		// 瞬時態: 沒有OID的值,也沒有被session管理,此時的user物件是瞬時態物件
		User user = new User();
		user.setName("張飛");
		user.setAge(38);
		
		// 使用session儲存使用者
		// user物件中已經存在id的值,沒預設情況下,把user物件也儲存到session的快取中
		Serializable id = session.save(user);
		System.out.println("主鍵的值是"+id);
		// user 是持久態物件
		
		tr.commit();
		// session銷燬,快取沒有了
		session.close();
		// 列印
		// user物件存在id值,但是session銷燬了,快取不存在。
		//session還管理user物件?廢話,session都死了,還管理個屁啊
		//此時的user是託管態的物件
		System.out.println(user.getId());
		System.out.println(user.getName());
		
	}
	
	/**
	 *  持久態的物件有自動更新資料庫的能力
	 */
	@Test
	public void run2() {
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		
		// 獲取持久態的物件
		User user = session.get(User.class,1);
		System.out.println(user.getName());
		// user 是持久態,有自動更新資料庫的能力
		// 重新設定新的名稱
	    user.setName("劉玄德");
		System.out.println(user.getName());
		
		tr.commit();
		session.close();
		
	}
	

}



相關文章