隨筆-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 特立獨行 閱讀(284) 評論(0)  編輯  收藏 所屬分類: Hibernate框架
          主站蜘蛛池模板: 萨迦县| 德州市| 钦州市| 玉树县| 泗阳县| 宁津县| 双柏县| 什邡市| 城固县| 拉孜县| 泸州市| 丹巴县| 渑池县| 宁强县| 监利县| 阿克| 丹棱县| 缙云县| 壤塘县| 凉城县| 天水市| 襄城县| 尼木县| 山东| 招远市| 文山县| 镇巴县| 博客| 瑞金市| 卢氏县| 双峰县| 涟源市| 龙门县| 宁乡县| 天等县| 四川省| 光泽县| 黑山县| 永和县| 阿坝| 远安县|