在Hibernate中,持久化對象在操作過程中可以分爲三個時期,這三個時期是與Session的週期相關的,因爲Hibernate中的操作都是基於Session完成的。所以Session對象的生命週期也關係着持久化對象的生命週期。持久化對象的三種生命週期分別是瞬時態(Transient)、持久態(Persistent)和脫管態(Detached)。
1. 瞬時態
瞬時態的對象時剛剛用new關鍵字創建出來的,還沒有進入Session管理,此時的對象沒有和數據庫中的記錄對應,從未與任何持久化上下文關聯過,沒有持久化標識(相當於沒有主鍵值)
示例代碼如下:
user.setName("JJ");
user.setCity("廣州");
session.save(user);//持久化
tx.commit();
此時user就是處於瞬時態的持久化對象。
瞬時態的特徵如下:
(1) 在數據庫中沒有與之匹配的數據。
(2) 沒有納入Session的管理。
2. 持久態
通過Session的save()、persist()或者saveOrUpdate()方法保存處於瞬時態的對象
後,該對象就變爲持久態,此時Session中已存在該對象,並且對應數據庫中的一條記錄。
示例代碼如下:
SessionFactory sessionFactory=config.buildSessionfactory();
Session session =sessionFactory.getCurrentSession();
Transaction tx=session.beginTransaction();
User user =new User();
user.setName("JJ");
user.setCity("廣州");
session.save(user);//持久化
tx.commit();
在調用save()方法後,持久化對象user就變爲持久態,但是執行了commit()方法之後,數據庫操作纔會執行。Session對象的get()和load()方法也可以返回一個持久態的對象,這個對象代表數據庫中的一條記錄。
持久態的特徵如下:
(1) 對象在數據庫中有與之對應的數據
(2) 納入了Session的管理
(3) 在清理緩存(髒數據檢查)的時候,會和數據庫同步。即在Session對象失效之前,
對持久態對象的任何修改,在調用Session對象的close()或Transaction對象的commit()方法後,數據庫表中對應的數據會同時更新。
3. 脫管態
脫管態,是離開Session管理的狀態。處於脫管態的持久化對象的標識符屬性和數據庫表中某條記錄的主鍵相對應,但他脫離了Session的管理,再次對其操作時,Hibernate無法感知其變化。
示例代碼如下:
SessionFactory sessionFactory=config.buildSessionfactory();
Session session =sessionFactory.getCurrentSession();
Transaction tx=session.beginTransaction();
User user =new User();
user.setName("JJ");
user.setCity("廣州");
session.save(user);
tx.commit();
user.setCity("汕頭");
雖然後來又修改了user對象的city屬性,但是在脫管態修改的,程序結束也不能在影響數據庫中數據的變化。處於脫管態的對象可以重新調用Session對象的update()方法回到持久態,否則Java虛擬機會在適當的時機進行垃圾回收。
重新回到持久態的實例代碼如下:
SessionFactory sessionFactory=config.buildSessionfactory();
Session session =sessionFactory.getCurrentSession();
Transaction tx=session.beginTransaction();
User user =new User();
user.setName("JJ");
user.setCity("廣州");
session.save(user);
tx.commit();
user.setCity("汕頭");
session=sessionFactory.getCurrentSession();
tx=session.beginTransaction();
session.update(user)//重新持久化
tx.commit();
脫管態的特徵如下:
(1) 在數據庫中有與之匹配的數據
(2) 沒有納入Session的管理
4. 三種狀態轉換的演示實例
如果一個對象被創建出來的時候處於瞬時態,此時調用save()或update()方法可以
將對象變爲持久態,處於持久態的對象調用close、clear、evict()方法可以轉換爲脫管態,具體的裝換過程如圖:
end:最後貼上一段Hibernate操作數據庫的簡單代碼
public class Client{
public static void main(String[] args){
//讀取hibernate.cfg.xml文件
Configuration cfg=new Configuration().configure();
//創建SessionFactory
SessionFactory factory=cfg.buildSessionfactory();
Session session=null;
try{
session=factory.openSession();
//開啓事務
session.beginTransaction();
User user =new User();
user.setName("JJ");
user.setCity("廣州");
//保存數據
session.save(user);
//提交事務
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
//回滾事務
session.getTransaction().rollback();
}finally{
if(session!=null){
if(session.isOpen()){
//關閉session
session.close();
}
}
}
}
}
(本文內容摘自課本)