1. 程式人生 > >【SSH】——Hibernate三種狀態之間的轉化

【SSH】——Hibernate三種狀態之間的轉化

Hibernate的三種狀態為:transient、persistent和detached。對這三種狀態的理解可以結合Session快取,在Session快取中的狀態為persistent,另外兩種不在Session中。
另一種說法是,Hibernate有四種狀態,增加一個removed狀態。在一個session例項的快取中刪除時會轉化到該狀態。

  1. transient
    通過new()建立,不在session的快取中,也與資料庫無關的狀態。處在該狀態的物件稱為臨時物件。

  2. persistent
    物件在session快取區中,資料庫中有資料與之對應。

  3. detached
    俗稱遊離狀態,即存在於資料庫中,但session中已經不存在該物件。

Hibernate三種狀態之間的轉化

上圖是其三種狀態之間的轉化,下面我們通過例項來具體看一下。

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快取、資料庫之間的關聯。