【SSH】——Hibernate三種狀態之間的轉化
阿新 • • 發佈:2019-01-30
Hibernate的三種狀態為:transient、persistent和detached。對這三種狀態的理解可以結合Session快取,在Session快取中的狀態為persistent,另外兩種不在Session中。
另一種說法是,Hibernate有四種狀態,增加一個removed狀態。在一個session例項的快取中刪除時會轉化到該狀態。
transient
通過new()建立,不在session的快取中,也與資料庫無關的狀態。處在該狀態的物件稱為臨時物件。persistent
物件在session快取區中,資料庫中有資料與之對應。detached
俗稱遊離狀態,即存在於資料庫中,但session中已經不存在該物件。
上圖是其三種狀態之間的轉化,下面我們通過例項來具體看一下。
1、開始——>transient
private static SessionFactory factory;
/**
* 完成sessionFactory的初始化
*/
static{
try{
//讀取hibernate.cfg.xml配置檔案
Configuration cfg=new Configuration().configure();
//建立sessionFactory,可訪問mysql
factory=cfg.buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
//獲得session
public static Session getSession(){
return factory.openSession();
}
獲取session物件
//獲取session物件
session = HibernateUtil.getSession();
// 開啟
ts = session.beginTransaction();
// Transient狀態
user = new User();
user.setName("張三");
user.setPassword("1233");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
執行new()方法之後,物件進入transient狀態。對照上圖也可以看出,如果接下來不對其進行操作,該物件最終會被垃圾回收,不再是transient狀態。
那麼接下來,我們對其執行簡單的save()操作。
2、transient——>persistent
// 執行過後,被session管理 Persistent
session.save(user);
//修改使用者姓名
user.setName("張四");
//commit會把資料與資料庫進行同步。
ts.commit();
3、persistent——>detached
關閉session,物件狀態由持久化轉為遊離態。
if(session!=null){
if(session.isOpen()){
session.close();
}
}
4、detached——>persistent
這裡,我們通過update()方法實現。
//再次修改使用者名稱
user.setName("張五");
//獲取session物件,與上面類似
session = HibernateUtil.getSession();
// 開啟
ts = session.beginTransaction();
// 將session管理
// 變為persistent狀態,清理快取時同步資料庫。
session.update(user);
session.getTransaction().commit();
瞭解Hibernate中物件的三種狀態,可以幫助我們對其進行靈活的操作。也可以幫助我們理解他與session快取、資料庫之間的關聯。