隨筆-124  評(píng)論-49  文章-56  trackbacks-0

          session flush測(cè)試:

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

          session在什么情況下執(zhí)行flush
          1 默認(rèn)在事務(wù)提交時(shí)
          2 顯式的調(diào)用flush
          3 在執(zhí)行查詢前,如:iterate

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

            <id name="id">
             <generator class="uuid"/>
            </id>
            因?yàn)閕d的主鍵生成策略采用的是uuid,所以調(diào)用完save后,只是將user對(duì)象納入到session的管理
            不會(huì)發(fā)出insert語句,但是id已經(jīng)生成,session中existsInDatebase狀態(tài)為false
            session.save(user);
            調(diào)用flush,hibernate會(huì)清理緩存,執(zhí)行sql
            如果數(shù)據(jù)庫(kù)的隔離級(jí)別為提交讀,那么我們可以看到flush過的數(shù)據(jù)
            并且session中existsInDatebase狀態(tài)變?yōu)閠rue
            session.flush();
            默認(rèn)情況下commit操作會(huì)先執(zhí)行者flush清理緩存,所以不用顯式的調(diào)用flush
            commit后數(shù)據(jù)無法回滾
            session.getTransaction().commit();
            
            <id name="id">
             <generator class="native"/>
            </id>
            如果id的主鍵生成策略采用的是native,調(diào)用save(user)時(shí)會(huì)發(fā)出insert語句,返回由數(shù)據(jù)庫(kù)生成的id,
            user對(duì)象納入到session的管理,session中existsInDatebase狀態(tài)為true
          -----------------------------------------------------------------
            <id name="id">
             <generator class="uuid"/>
            </id>
            session.save(user);
            將user對(duì)象從session中逐出,即session的EntiryEntries屬性中逐出
            session.evict(user);//清理緩存
            無法成功提交,因?yàn)閔ibernate在清理緩存時(shí),在session的insertions集合中取出user對(duì)象進(jìn)行insert操作后
            需要更新entityEntries屬性中的existsnDatabase為true,而我們采用evict已經(jīng)將user從session中
            逐出了,所以找不到相關(guān)數(shù)據(jù),無法更新,拋出異常
            session.getTransaction().commit();
          ----------------------------------------------------------------
            <id name="id">
             <generator class="uuid"/>
            </id>
            session.save(user);
            flush后hibernate會(huì)清理緩存,會(huì)將user對(duì)象保存到數(shù)據(jù)庫(kù)中,將session中的insertions中的user
            清除,并且設(shè)置session中existsInDatabase的狀態(tài)為true
            session.flush(user);
            將user對(duì)象從session中逐出,即session的EntityEntries屬性中逐出
            session.evict(user);//清理緩存
            可以成功提交,因?yàn)閔ibernate在清理緩存時(shí),在session的insertions集合中無法找到user對(duì)象
            所以就不會(huì)發(fā)出insert語句,也不會(huì)更新session中的existsInDatabase的狀態(tài)
            session.getTransaction().commit();
          -----------------------------------------------------------------
            <id name="id">
             <generator class="native"/>
            </id>
            session.save(user);
            將user對(duì)象從session中逐出,即session的EntityEntries屬性中逐出
            session.evict(user);//清理緩存
            可以成功提交,因?yàn)閔ibernate在清理緩存時(shí),在session的insertions集合中無法找到user對(duì)象
            所以就不會(huì)發(fā)出insert語句,也不會(huì)更新session中的existsInDatabase的狀態(tài)
            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();
            結(jié)果:
            insert into ...
            insert into ...
            update t_user ...
            hibernate按照save(insert),update,delete順序提交相關(guān)的操作
          -----------------------------------------------------------------
             <id name="id">
             <generator class="assigned"/>
            </id>
            session.save(user);
            user.setName("張三");
            session.update(user);
            因?yàn)槲覀冊(cè)趕ession.update(user)后執(zhí)行了flush,所以在以commit清理緩存時(shí)執(zhí)行flush前的sql就不會(huì)發(fā)出.
            session.flush();//在這里flush操作就可以了
            
            User user2=new User();
            user2.setId("003");
            user2.setName("李四");
            session.getTransaction().commit();
            結(jié)果:
            insert into ...
            update t_user ...
            insert into ...
            按照我們想要順序save(insert),update,save(insert)的順序提交操作
          -----------------------------------------------------------------

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

          評(píng)論:
          # re: hibernate基礎(chǔ)-Session_Flush 2014-04-15 00:00 | rejk
          你怎么查到的>?>  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 长治市| 文山县| 张家港市| 中阳县| 天津市| 吴川市| 聂荣县| 定襄县| 庄河市| 如东县| 肥城市| 荆门市| 榆中县| 威远县| 金堂县| 广饶县| 义乌市| 根河市| 吉林市| 右玉县| 杂多县| 松江区| 察隅县| 金湖县| 拉萨市| 河池市| 静海县| 广水市| 彰化县| 东阿县| 大港区| 九江市| 惠水县| 张家川| 新巴尔虎右旗| 天津市| 北安市| 高青县| 晴隆县| 南投市| 宁蒗|