Hibernate中對象的三種狀態 – JAVA編程語言程序開發技術文章

   Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行瞭非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。使用Hibernate可以使我們采用面向對象的思維操作關系型數據庫。此時,hibernate中對象有三種狀態。

    對象的狀態主要取決於對象是否在session中。

    1、在session外是什麼樣子的;
    瞬時對象(Transient Objects):使用new操作符初始化的對象不是立刻就持久的。它們的狀態是瞬時的,也就是說它們沒有任何跟數據庫表相關聯的行為,隻要應用不再引用這些對象(不再被任何其他對象所引用),它們的狀態將會丟失,並有垃圾回收機制回收。
 
    2、在session中是什麼樣子的;
    持久化對象(Persist Objects):持久實例是任何具有數據庫標識的實例。它由持久化管理器session統一管理,持久實例是在事務中進行操作的——它們的狀態在事務結束時同數據庫進行同步。當事務提交時,通過執行SQL的Insert、Update和Delete語句把內存中的狀態同步到數據庫中。
 
    3、從session中出來之後是什麼樣子的。
    離線對象(Detached Objects):session關閉後,持久化對象變為離線對象。離線表示這個對象不能再與數據庫保持同步,它們不再接受Hibernate管理。

 

 

    說明:
    當創建一個狀態,即Transient。此狀態特點:數據庫中沒有,沒有被session管理。
    可以這樣理解:session中有一個map,當save時,先放到map中,然後再放到數據庫中。
    當對象被save後,則轉入Persist狀態,此時狀態是持久的,被保存到數據庫中。
    當session執行close/evct/clear時,此時不被session管理,隻是存到瞭數據庫中。此時為Detached狀態。
 
    通過代碼分析這三種狀態的轉換過程:
[html] 
public class SessionTest extends TestCase { 
    public void testSave1() 
    { 
        Session session=null; 
 
        Transaction tx=null; 
         
        User user=null; 
         
        try{ 
            session=HibernateUtils.getSession(); 
            //開啟事務 
            tx=session.beginTransaction(); 
             
            //Transient狀態 
            user=new User(); 
            user.setName("zhangsan"); 
            user.setPassword("123"); 
            user.setCreateTime(new Date()); 
            user.setExpireTime(new Date()); 
             
            //Persistent狀態 
            //Persistent狀態的對象,當對象的屬性發生改變的時候, 
            //hibernate在清理緩存(臟數據檢查)的時候,會和數據庫同步 
            session.save(user); 
             
            user.setName("lisi"); 
                                     
            //提交事務 
            tx.commit(); 
             
        }catch(Exception e) 
        { 
            e.printStackTrace(); 
            //回滾事務 
            tx.rollback(); 
        }finally 
        { 
            //關閉session 
            HibernateUtils.closeSession(session); 
        } 
         
        //Detached狀態 
        user.setName("wangwu"); 
        try{ 
            session=HibernateUtils.getSession(); 
            session.beginTransaction(); 
            //將Detached狀態的數據重新納入session管理 
            //此時將變為persistent狀態 
            //persistent狀態的對象在清理緩存時會和數據庫同步 
            session.update(user); 
            //提交事務,清理緩存,把內存中的事務放到緩存中去 
            session.getTransaction().commit(); 
        }catch(Exception e) 
        { 
            e.printStackTrace(); 
            session.getTransaction().rollback(); 
             
        }finally{ 
            HibernateUtils.closeSession(session); 
        } 
         
    }    

作者:missysm586

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。