隨筆-21  評(píng)論-29  文章-0  trackbacks-0

          在Base類中加入以下代碼實(shí)現(xiàn)get方法

          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");
                  addUser(user);    
                  
                  User u 
          = getUser(user.getId());
                  System.out.println(
          "name:"+u.getName());
              }

              
               
          static User getUser(int id){
                   Session s 
          = null ;
                   
          try{
                       s 
          = HibernateUtil.getSession();
                       Class userClass 
          = User.class;
                       User user 
          = (User)s.get(User.class,id);
                       
          return user ;
                   }
          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);
                          tx.commit();
                      }
          catch(HibernateException e){
                          
          if(tx !=null)
                              tx.rollback();
                          
          throw e ;
                      }
          finally {
                          
          if(s !=null)
                              s.close();
                      }

                  }

                  
          }

          對(duì)get方法參數(shù)User.class的理解:
          由于Session可以管理多個(gè)數(shù)據(jù)庫(kù)表所對(duì)應(yīng)的多個(gè)實(shí)體對(duì)象。如果要查詢id為1的實(shí)體對(duì)象,Session.get方法需要知道去哪個(gè)數(shù)據(jù)庫(kù)表中查詢id為1的記錄,所以。除了給get方法傳遞所要查詢的實(shí)體對(duì)象的id值外,還必須給get方法傳遞實(shí)體對(duì)象的類型,get方法才能知道去哪個(gè)數(shù)據(jù)庫(kù)表中進(jìn)行查詢。
          控制臺(tái)顯示結(jié)果:    name:name

          在配置文件hibernate.cfg.xml文件中加入
          <property name="show_sql">true</property> 
          可顯示所執(zhí)行的sql語(yǔ)句

          load方法
          懶加載 并不馬上訪問(wèn)數(shù)據(jù)庫(kù) 只有第一次應(yīng)用時(shí)才訪問(wèn)數(shù)據(jù)庫(kù) load方法的返回對(duì)象永遠(yuǎn)不可能為空

          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");
                  addUser(user);    
                  
                  User u 
          = getUser(user.getId());
                  System.out.println(
          "name:"+u.getName());
              }

              
               
          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());
                       System.out.println(user1.getClass().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);
                          tx.commit();
                      }
          catch(HibernateException e){
                          
          if(tx !=null)
                              tx.rollback();
                          
          throw e ;
                      }
          finally {
                          
          if(s !=null)
                              s.close();
                      }

                  }

                  
          }


          在這里增加的打印user1類名的代碼,看到load方法所返回User子類的名稱。

          save與persist方法的區(qū)別:在沒(méi)有開(kāi)啟事務(wù)的時(shí)候
          save方法會(huì)把數(shù)據(jù)插入到數(shù)據(jù),之后又回滾,刪掉數(shù)據(jù)。而persist方法根本就不執(zhí)行插入。

          總結(jié)Session的幾個(gè)主要方法:
            1 save,persist保存數(shù)據(jù),persist在事務(wù)外不會(huì)產(chǎn)生insert語(yǔ)句;
            2.delete,刪除對(duì)象;
            3.update,更新對(duì)象,如果數(shù)據(jù)庫(kù)中沒(méi)有記錄,會(huì)出現(xiàn)異常;
            4.get,根據(jù)id查,會(huì)立刻訪問(wèn)數(shù)據(jù)庫(kù)。
            5.load,根據(jù)id查(返回的是代理,不會(huì)立即訪問(wèn)數(shù)據(jù)庫(kù))
            6.saveOrUpdate,merge(根據(jù)id和version的值來(lái)確定是save或update),調(diào)用merge你的對(duì)象還是托管的。
            7.lock()把對(duì)象變成持久對(duì)象,但不會(huì)同步對(duì)象的狀態(tài)

          下午學(xué)習(xí)實(shí)體對(duì)象的三種狀態(tài)與saveOrUpdate方法。

          posted on 2009-05-04 11:10 特立獨(dú)行 閱讀(1008) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate框架
          主站蜘蛛池模板: 浦江县| 阳谷县| 桑日县| 郑州市| 梅河口市| 颍上县| 广州市| 南通市| 惠水县| 香港 | 奎屯市| 三江| 霍林郭勒市| 邓州市| 潞西市| 开阳县| 屯留县| 兴和县| 彰化市| 察隅县| 靖安县| 曲沃县| 宁陕县| 德兴市| 承德县| 横峰县| 金沙县| 汝阳县| 荔浦县| 临海市| 沙洋县| 阿图什市| 昌图县| 保康县| 宜章县| 兴文县| 成武县| 长兴县| 永清县| 平安县| 衡山县|