隨筆-61  評論-159  文章-0  trackbacks-0
                 用hibernate的ORM框架有一段時間了,現(xiàn)在來回顧一下Seesion中的load和get。
                 一、get不支持lazy,load支持lazy。
                 二、采用get加載數(shù)據(jù),如果沒有匹配的數(shù)據(jù),返回null,而load則拋出異常。
                 get的例子:
           1public void testGetMethod() {
           2        Session session = null;
           3        try {
           4            session = HibernateUtils.getSession();
           5            session.beginTransaction();
           6            
           7            //馬上發(fā)出查詢sql,加載User對象
           8            User user = (User)session.get(User.class"402880d01b9bf210011b9bf2c2ff0002");
           9            System.out.println("user.name=" + user.getName());
          10            
          11            user.setName("張三");
          12            session.getTransaction().commit();
          13        }
          catch(Exception e) {
          14            e.printStackTrace();
          15            session.getTransaction().rollback();
          16        }
          finally {
          17            HibernateUtils.closeSession(session);
          18        }

          19    }

          PS:在執(zhí)行第8行語句的時候,如果數(shù)據(jù)庫有相關(guān)的記錄,則立刻發(fā)出sql語句,即使是沒有第9行中user.getName()方法調(diào)用,如果沒有匹配的記錄則返回來一個null。

                  load方法例子:
           1public void testLoadMethod() {
           2        Session session = null;
           3        try {
           4            session = HibernateUtils.getSession();
           5            session.beginTransaction();
           6            
           7            //不會發(fā)出查詢sql,因為load方法實現(xiàn)了lazy(懶加載或延遲加載)
           8            //延遲加載:只有真正使用這個對象的時候,才加載(發(fā)出sql語句)
           9            //hibernate延遲加載實現(xiàn)原理是代理方式
          10            User user = (User)session.load(User.class"402880d01b9bf210011b9bf2b2ff0002");
          11            System.out.println("user.name=" + user.getName());
          12            user.setName("李四");
          13            session.getTransaction().commit();
          14        }
          catch(Exception e) {
          15            e.printStackTrace();
          16            session.getTransaction().rollback();
          17        }
          finally {
          18            HibernateUtils.closeSession(session);
          19        }

          20    }

          PS:在執(zhí)行到10句代碼的時候并沒有立刻發(fā)出sql語句,由于load實現(xiàn)了lazy延遲加載,延遲加載只有真正使用該對象的時候才進(jìn)行加載,發(fā)出sql語句,關(guān)鍵是11句代碼。如果load方法里面的id在數(shù)據(jù)庫表里面沒有相關(guān)的,則會發(fā)出ObjectNotFoundException異常。

          PSPS:可以通過設(shè)置斷點,用debug來跟蹤相關(guān)變量跟對象的改變,這樣就可以很清晰理解load和get這兩個方法。


          -------------------------------------------------------------------------------------------------
          PS:本博客文章,如果沒有注明是有“轉(zhuǎn)”字樣,屬于本人原創(chuàng)。如果需要轉(zhuǎn)載,務(wù)必注明作者文章的詳細(xì)出處地址,否則不允許轉(zhuǎn)載,多謝合作!
          posted on 2008-10-09 20:38 apple0668 閱讀(448) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 阳信县| 磴口县| 宁津县| 四子王旗| 樟树市| 龙门县| 香港| 达日县| 祁连县| 策勒县| 衡山县| 乌拉特前旗| 梁河县| 霍邱县| 读书| 祁东县| 宝清县| 越西县| 同江市| 临桂县| 吉木萨尔县| 茶陵县| 申扎县| 锡林郭勒盟| 尉氏县| 西畴县| 工布江达县| 怀仁县| 辽源市| 金乡县| 防城港市| 丰宁| 麦盖提县| 龙井市| 上虞市| 盘山县| 格尔木市| 黄龙县| 永安市| 曲阳县| 礼泉县|