天空是藍(lán)色的

          做好軟件為中國(guó) #gcc -c helloworld.c -o helloworld.o //編譯目標(biāo)文件 #gcc helloworld.o -o helloworld //編譯成可執(zhí)行exe #helloworld //運(yùn)行exe
          數(shù)據(jù)加載中……
          [轉(zhuǎn)載]session.flush()
          http://hairroot.blogchina.com/hairroot/1639334.html

          hibernate一個(gè)Session有一個(gè)Cache,cache屏蔽了應(yīng)用程序直接去訪問(wèn)數(shù)據(jù)庫(kù),如果同一張table的同一row在先前已經(jīng)被請(qǐng)求過(guò),那么為何下次請(qǐng)求的時(shí)候還要去請(qǐng)求一次呢,把前面的cache住,再遇到這樣的請(qǐng)求直接返回cache里邊的即可。

          cache里邊的數(shù)據(jù)如果含有臟數(shù)據(jù),需要跟數(shù)據(jù)庫(kù)同步(也就是需要hibernate來(lái)發(fā)送update, delete, insert),調(diào)用session.flush()達(dá)到此目的。一般情況下,hibernate在一個(gè)tx.commit()的時(shí)候會(huì)自動(dòng)調(diào)用session.flush();也可以應(yīng)用程序手動(dòng)調(diào)用session.flush()來(lái)立刻將session的臟數(shù)據(jù)提交。
          Session session = HibernateSessionFactory.currentSession();
                  Transaction tx = session.beginTransaction();
                  try{
                   Employee employee1 
          = (Employee)session.load(Employee.class, new Integer(3));
                   System.out.println(employee1);
                   employee1.setAge((byte)98);
                   session.flush();//發(fā)送employee1的update給數(shù)據(jù)庫(kù)
          //         employee1.setAge((byte)43);
                   tx.commit();//employee1已經(jīng)被flush過(guò),不會(huì)再被flush。如果把上面以行代碼注釋取消,還會(huì)再發(fā)一條update語(yǔ)句。
                  }
                  catch(HibernateException e){
                      e.printStackTrace()
          ;
                      tx.rollback();
                  }

                   tx 
          = session.beginTransaction();
                  Employee employee2 = (Employee) session.load(Employee.class, new Integer(3));
                  employee2.setGender('f');
                  System.out.println(employee2);
                  tx.commit();

          session.flush()的動(dòng)作執(zhí)行的時(shí)候,session中cache不會(huì)被清空,所以上面的employee2和employee1返回的還是同一個(gè)實(shí)例。

          那些被flush()過(guò)的對(duì)象不會(huì)在下次flush()的時(shí)候再被flush()一次,除非兩次flush()中間又產(chǎn)生了新的臟數(shù)據(jù)。

          我認(rèn)為應(yīng)用程序基本上不需要顯示去調(diào)用session.flush();而交給tx.commit()去做就可以了。原因是:手動(dòng)調(diào)用session.flush()雖然是往數(shù)據(jù)庫(kù)提交了update等sql語(yǔ)句,但是這些update真正的commit是在tx.commit()執(zhí)行的時(shí)候。所以手動(dòng)session.flush()后,其他的session或者是其他的應(yīng)用程序看到的仍然還是數(shù)據(jù)庫(kù)以前的數(shù)據(jù)。(可以試驗(yàn))

          - 作者: HairRoot 2005年05月24日, 星期二 20:02

          posted on 2006-01-09 12:15 bluesky 閱讀(1508) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 工作總結(jié)

          主站蜘蛛池模板: 石泉县| 海阳市| 清丰县| 涿州市| 葵青区| 葫芦岛市| 正宁县| 万宁市| 太原市| 莱西市| 香港| 苏尼特左旗| 探索| 瑞昌市| 中卫市| 翼城县| 香港| 郁南县| 墨脱县| 镇宁| 沧州市| 徐汇区| 屏南县| 龙岩市| 无极县| 马公市| 黎城县| 弥勒县| 叙永县| 衡阳市| 长寿区| 分宜县| 沙田区| 富锦市| 宜宾市| 平远县| 综艺| 河津市| 新沂市| 西昌市| 蚌埠市|