<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-21  評論-29  文章-0  trackbacks-0
    實體對象的三種狀態
        瞬時(transient):數據庫中沒有數據與之對應,超過作用域會被JVM垃圾回收器回收,一般是new出來且與session沒有關聯的對象;
        持久(persistent):數據庫中有數據與之對應,當前與session有關聯,并且相關聯的session沒有關閉,事務沒有提交;持久對象狀態發生改變,在事務提交時會影響到
                                          數據庫(Hibernate能檢測到);
        脫管(detached):數據庫中有數據與之對應,但當前沒有session與之關聯;托管對象狀態發生改變,Hibernate不能檢測到。


    如上圖所示,當我們new處一個user時,這個對象是瞬時的;(與數據庫、session均無關系)
    當我們用save方法使user對象保存到session時,這時對象是持久的;
    當user對象發生變化,如執行commit語句,user對象的變化都會反映在數據庫中。(數據庫中有數據對應,在session管理之中)
    當調用close語句后,user對象從session中出來,此時對象是脫管的。(數據庫中有數據對應,但與session沒關系了)

    以下實例說明以上三種實體對象狀態
    package cn.itcast.hibernate;
    import java.util.Date;

    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import cn.itcast.hibernate.domain.User;
    import org.hibernate.Transaction;
    public class Base {

        
    public static void main(String[] args) {
            
            User user 
    = new User();
            user.setBirthday(
    new Date());
            user.setName(
    "name");
            
    //111  以上的user對象為瞬時對象
            addUser(user);    
            System.out.println(
    "id:"+user.getId());
            
    //222  與111之間的user對象為脫管對象
            
        }

        
         
    static User getUser(int id){
             Session s 
    = null ;
             
    try{
                 s 
    = HibernateUtil.getSession();
                 Class userClass 
    = User.class;
                 
    //User user = (User)s.get(User.class,id);
                 User user1 = (User)s.load(User.class,id);
                 System.out.println(
    "name:"+user1.getName());
                 
                 
    return user1 ;
             }
    finally {
                 
    if(s !=null)
                     s.close();
             }

         }

        
            
    static void addUser(User user){
                Session s 
    = null ;
                Transaction tx 
    = null ;
                
    try{
                    s 
    = HibernateUtil.getSession();
                    tx 
    = s.beginTransaction();
                    s.save(user);
                    
    //333  
                    user.setName("new name");
                    tx.commit();
                    
    //444  與333之間的對象為持久對象
                }
    catch(HibernateException e){
                    
    if(tx !=null)
                        tx.rollback();
                    
    throw e ;
                }
    finally {
                    
    if(s !=null)
                        s.close();
                }

            }

            
    }

    執行該程序 觀察控制臺輸出

    再查看數據庫中user表內容

    發現持久對象的狀態改變Hibernate能知道,會在數據庫中得到反映。

    脫管對象的狀態如果想將其狀態反映到數據庫中,可以調用session的update方法。


    當我們不知道對象是瞬時的還是脫管的,可以調用session的saveOrUpdate方法,由Hibernate自己(根據對象的id是否有值)判定處理。
    調用saveOrUpdate保存對象,對象將變成持久的,而調用merge方法對象還是脫管的。

    對象調用setName等方法,數據庫并不會立即更新,而是到執行commit語句后才更新。盡量延遲和數據庫的交互。

    補充:三種對象轉換關系圖

     

    posted on 2009-05-04 14:20 特立獨行 閱讀(281) 評論(0)  編輯  收藏 所屬分類: Hibernate框架
    主站蜘蛛池模板: 国产AⅤ无码专区亚洲AV| 国产成人精品免费午夜app| 女人被弄到高潮的免费视频| 久久亚洲精品成人AV| 日本免费一区二区三区| 亚洲av午夜福利精品一区人妖| 永久免费av无码网站yy| 亚洲精品无码专区久久久| a在线免费观看视频| 亚洲精品高清视频| 国产91免费在线观看| 亚洲中文字幕无码爆乳| 国产精品久免费的黄网站| 色哟哟国产精品免费观看| 中文字幕亚洲图片| 人人玩人人添人人澡免费| 在线电影你懂的亚洲| 性感美女视频在线观看免费精品| 亚洲精品无码久久久久久| 国产免费观看黄AV片| CAOPORM国产精品视频免费| 亚洲日韩中文无码久久| 亚欧免费视频一区二区三区| 亚洲午夜无码久久久久小说| 亚洲国产精品成人AV无码久久综合影院| 和老外3p爽粗大免费视频| 亚洲最大福利视频网站| 在线播放高清国语自产拍免费| 一级毛片免费在线观看网站| 亚洲男人天堂av| 精品久久洲久久久久护士免费| 色吊丝性永久免费看码| 久久久亚洲欧洲日产国码二区 | 亚洲AV日韩AV一区二区三曲 | 亚洲AV日韩精品久久久久| 在线观看免费视频资源| 真正全免费视频a毛片| 久久亚洲成a人片| 国产高清在线免费视频| 男的把j放进女人下面视频免费| 亚洲综合色丁香婷婷六月图片|