隨筆-124  評論-49  文章-56  trackbacks-0

          session flush測試:

          session flush方法主要做了兩件事:
          1 清理緩存
          2 執行sql(不是提交事務)

          session在什么情況下執行flush
          1 默認在事務提交時
          2 顯式的調用flush
          3 在執行查詢前,如:iterate

          hibernate按照save(insert),update,delete順序提交相關的操作
          ------------------------------------------------------------------------

            <id name="id">
             <generator class="uuid"/>
            </id>
            因為id的主鍵生成策略采用的是uuid,所以調用完save后,只是將user對象納入到session的管理
            不會發出insert語句,但是id已經生成,session中existsInDatebase狀態為false
            session.save(user);
            調用flush,hibernate會清理緩存,執行sql
            如果數據庫的隔離級別為提交讀,那么我們可以看到flush過的數據
            并且session中existsInDatebase狀態變為true
            session.flush();
            默認情況下commit操作會先執行者flush清理緩存,所以不用顯式的調用flush
            commit后數據無法回滾
            session.getTransaction().commit();
            
            <id name="id">
             <generator class="native"/>
            </id>
            如果id的主鍵生成策略采用的是native,調用save(user)時會發出insert語句,返回由數據庫生成的id,
            user對象納入到session的管理,session中existsInDatebase狀態為true
          -----------------------------------------------------------------
            <id name="id">
             <generator class="uuid"/>
            </id>
            session.save(user);
            將user對象從session中逐出,即session的EntiryEntries屬性中逐出
            session.evict(user);//清理緩存
            無法成功提交,因為hibernate在清理緩存時,在session的insertions集合中取出user對象進行insert操作后
            需要更新entityEntries屬性中的existsnDatabase為true,而我們采用evict已經將user從session中
            逐出了,所以找不到相關數據,無法更新,拋出異常
            session.getTransaction().commit();
          ----------------------------------------------------------------
            <id name="id">
             <generator class="uuid"/>
            </id>
            session.save(user);
            flush后hibernate會清理緩存,會將user對象保存到數據庫中,將session中的insertions中的user
            清除,并且設置session中existsInDatabase的狀態為true
            session.flush(user);
            將user對象從session中逐出,即session的EntityEntries屬性中逐出
            session.evict(user);//清理緩存
            可以成功提交,因為hibernate在清理緩存時,在session的insertions集合中無法找到user對象
            所以就不會發出insert語句,也不會更新session中的existsInDatabase的狀態
            session.getTransaction().commit();
          -----------------------------------------------------------------
            <id name="id">
             <generator class="native"/>
            </id>
            session.save(user);
            將user對象從session中逐出,即session的EntityEntries屬性中逐出
            session.evict(user);//清理緩存
            可以成功提交,因為hibernate在清理緩存時,在session的insertions集合中無法找到user對象
            所以就不會發出insert語句,也不會更新session中的existsInDatabase的狀態
            session.getTransaction().commit();
          -----------------------------------------------------------------
              <id name="id">
             <generator class="assigned"/>
            </id>
            session.save(user);
            user.setName("張三");
            session.update(user);
            User user2=new User();
            user2.setId("003");
            user2.setName("李四");
            session.getTransaction().commit();
            結果:
            insert into ...
            insert into ...
            update t_user ...
            hibernate按照save(insert),update,delete順序提交相關的操作
          -----------------------------------------------------------------
             <id name="id">
             <generator class="assigned"/>
            </id>
            session.save(user);
            user.setName("張三");
            session.update(user);
            因為我們在session.update(user)后執行了flush,所以在以commit清理緩存時執行flush前的sql就不會發出.
            session.flush();//在這里flush操作就可以了
            
            User user2=new User();
            user2.setId("003");
            user2.setName("李四");
            session.getTransaction().commit();
            結果:
            insert into ...
            update t_user ...
            insert into ...
            按照我們想要順序save(insert),update,save(insert)的順序提交操作
          -----------------------------------------------------------------

          posted on 2009-11-03 16:37 junly 閱讀(1234) 評論(1)  編輯  收藏 所屬分類: hibernate/orm

          評論:
          # re: hibernate基礎-Session_Flush 2014-04-15 00:00 | rejk
          你怎么查到的>?>  回復  更多評論
            
          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          other

          文章

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 七台河市| 休宁县| 蕉岭县| 左云县| 高阳县| 曲靖市| 安图县| 布拖县| 绿春县| 厦门市| 湖口县| 邛崃市| 凤翔县| 定边县| 岫岩| 南川市| 陆良县| 鄢陵县| 将乐县| 扎鲁特旗| 临城县| 高雄市| 兴安县| 绥化市| 吴旗县| 庆安县| 轮台县| 鹿邑县| 长海县| 雅江县| 平山县| 宝山区| 广州市| 静宁县| 海伦市| 砀山县| 全南县| 新安县| 东源县| 安阳县| 吴江市|