隨筆-61  評論-159  文章-0  trackbacks-0
                 用hibernate的ORM框架有一段時間了,現在來回顧一下Seesion中的load和get。
                 一、get不支持lazy,load支持lazy。
                 二、采用get加載數據,如果沒有匹配的數據,返回null,而load則拋出異常。
                 get的例子:
           1public void testGetMethod() {
           2        Session session = null;
           3        try {
           4            session = HibernateUtils.getSession();
           5            session.beginTransaction();
           6            
           7            //馬上發出查詢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:在執行第8行語句的時候,如果數據庫有相關的記錄,則立刻發出sql語句,即使是沒有第9行中user.getName()方法調用,如果沒有匹配的記錄則返回來一個null。

                  load方法例子:
           1public void testLoadMethod() {
           2        Session session = null;
           3        try {
           4            session = HibernateUtils.getSession();
           5            session.beginTransaction();
           6            
           7            //不會發出查詢sql,因為load方法實現了lazy(懶加載或延遲加載)
           8            //延遲加載:只有真正使用這個對象的時候,才加載(發出sql語句)
           9            //hibernate延遲加載實現原理是代理方式
          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:在執行到10句代碼的時候并沒有立刻發出sql語句,由于load實現了lazy延遲加載,延遲加載只有真正使用該對象的時候才進行加載,發出sql語句,關鍵是11句代碼。如果load方法里面的id在數據庫表里面沒有相關的,則會發出ObjectNotFoundException異常。

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


          -------------------------------------------------------------------------------------------------
          PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者文章的詳細出處地址,否則不允許轉載,多謝合作!
          posted on 2008-10-09 20:38 apple0668 閱讀(448) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 双牌县| 太仓市| 舒城县| 巴东县| 广宁县| 东安县| 天柱县| 慈溪市| 东阳市| 商河县| 阿拉善右旗| 昆明市| 松桃| 陇西县| 遂川县| 海林市| 神池县| 保山市| 枞阳县| 西吉县| 徐闻县| 石景山区| 阳山县| 喀什市| 开远市| 深水埗区| 佛山市| 大厂| 台安县| 宜章县| 平武县| 镇远县| 康乐县| 育儿| 宣武区| 聂拉木县| 南开区| 格尔木市| 永胜县| 桑植县| 铁岭县|