標籤:save 存在 .com name 一級緩衝 圖書 nat 建立 date()
時間:2017-1-19 23:00
——Hibernate持久化類的狀態
1、持久化類:就是一個實體類與資料庫建立了映射。
2、Hibernate為了方便管理持久化類,將持久化類分為了三種狀態:
1)瞬時態:transient(臨時態)
2)持久態:persistent
3)脫管態:detached(離線態)
——三種持久化對象的狀態
1、三種持久化對象的狀態
1)瞬時態
不存在持久化標識OID,尚未與Hibernate Session關聯對象,被認為處於瞬時狀態,失去引用將被JVM回收。
無持久化標識OID,未與Session關聯。
2)持久態
存在持久化標識OID,與當前Session有關聯,並且關聯的Session沒有關閉,事務未提交。
存在持久化標識OID,與Session關聯。
持久化對象有自動更新資料庫的能力。
3)脫管態
存在持久化OID,但沒有與當前Session關聯,脫管狀態改變時Hibernate無法檢測。
存在持久化標識OID,未與Session關聯。
2、區分三種持久化對象的狀態
範例程式碼:
public class HibernateDemo1 { @Test /* * 區分持久化對象的三種狀態: */ public void fun1(){ // 1、建立Session Session session = HibernateUtils.openSession(); // 2、開啟事務 Transaction tx = session.beginTransaction(); /* * 3、邏輯操作 */
// 向資料庫中儲存一本圖書 Book book = new Book(); // 瞬時態:沒有唯一標識OID,沒有與Session關聯 book.setName("Hibernate"); book.setAuthor("張三"); book.setPrice(50D); session.save(book); // book變為一個持久態對象,有唯一標識OID,與Session關聯 // 4、提交事務 tx.commit(); // 5、施放資源 session.close(); book.setName("Struts2"); // 此時book就是脫管態了,有唯一標識OID,但與Session無關聯 }}
3、三種狀態物件的轉換
瞬時態:
Book book = new Book();
1)瞬時態 ——> 持久態
Book book = new Book();
session.save(book);
2)瞬時態 ——> 脫管態
book.setId(1); // 設定OID
持久態:
Book book = (Book)session.get(Book.class, 1);
get() / load() / find() iterate()
1)持久態 ——> 瞬時態
session.delete(book); // 刪掉之後就沒有OID了
2)持久態 ——> 脫管態
session.close()
clear() / evict(book) 將Session中的指定對象刪除。
脫管態:
Book book = new Book();
book.setId(1);
1)脫管 ——> 持久
session.update(book);
2)脫管 ——> 瞬時
book.setId(null);
——持久態對象自動更新資料庫
範例程式碼:
/* * 持久態對象自動更新資料庫 */ public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); // 獲得一個持久態對象 Book book = (Book)session.load(Book.class, 1); book.setName("Struts2"); tx.commit(); // 當提交時會發送一條update語句,自動更新資料庫資料,依賴的是Hibernate的一級緩衝 session.close(); }
——總結
1、Hibernate持久化對象的狀態:
* 瞬時態
沒有唯一標識OID,沒有與Session關聯
* 持久態
有唯一標識OID,與Session關聯
* 脫管態
有唯一標識OID,沒有與Session關聯
2、瞬時態對象
User user = new User()
瞬時態-->持久態
session.save(user)
瞬時態-->脫管態
user.setId(1)
3、持久態對象
get() / load()
持久態-->瞬時態
session.delete(Object)
持久態-->脫管態
session.close() / session.clear() / session.evice()
4、脫管態
User user = new User();
user.setId(1)
脫管態-->瞬時態
user.setId(null)
脫管態-->持久態
save() / saveOrUpdate()
Hibernate之持久化對象