posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          hibernate 部分問題總結(jié)——1

          Posted on 2007-11-12 16:29 G_G 閱讀(2076) 評(píng)論(3)  編輯  收藏 所屬分類: hibernate
          緩存問題:
          ???? /** ?使用?Query.executeUpdate()?緩存中數(shù)據(jù)不同步?解決辦法
          ?????*??Table?->?T1oo(id,name)
          ?????*?Table?->?T2oo(id,avg,aid)
          ?????*?外鍵?T1oo.id->T2oo.aid
          ?????*??Session.createQuery("delete?T1oo")?->??Query.executeUpdate()?
          ????
          */
          ????
          public ? void ?testExecuteUpdate(){
          ????????System.out.println(
          " \r\n\r\n********************ExecuteUpdate************************ " );
          ????????T1oo?t1oo?
          = ? new ?T1oo();
          ????????t1oo.setName(
          " liukaiyi " );
          ????????
          ????????HibernateSessionFactory.closeSession();
          ????????
          ????????Session?session?
          = ?HibernateSessionFactory.currentSession();
          ????Transaction?tr1?
          = ?session.beginTransaction();
          ????????
          // t1?成為?持久狀態(tài)?一級(jí)緩存中?加載
          ????????session.saveOrUpdate(t1oo);?
          ????????
          // 直接一條語(yǔ)句刪除T1oo,緩存無(wú)法同步
          ????????
          // 一級(jí)緩存中還有?t1
          ????????Query?qu? = ?session.createQuery( " delete?T1oo " );
          ????????
          try ?{
          ????????????qu.executeUpdate();
          ????????}?
          catch ?(Exception?e)?{????
          ????????????System.out.println(
          " //err:?有級(jí)聯(lián)?單使用?delete?T1oo?還要delete?T2oo.aid?=?T1oo.id// " );
          ????????????List?list?
          = ?session.createQuery( " from?T1oo " ).list();
          ????????????
          for (Iterator?it = list.iterator();it.hasNext();){
          ????????????????Query?t2qu?
          = ?session.createQuery( " delete?T2oo??where?aid=:id " );
          ????????????????t2qu.setInteger(
          " id " ,?((T1oo)it.next()).getId().intValue());
          ????????????????t2qu.executeUpdate();????????????????
          ????????????}
          ????????????qu.executeUpdate();
          ????????}
          ????????
          ????????tr1.commit();
          ????????
          ????Transaction?tr2?
          = ?session.beginTransaction();
          ????????
          // 這直接通過一級(jí)緩存中加載t2,但DB中以沒有此條數(shù)據(jù)
          ????????t1oo? = ?(T1oo)session.load(T1oo. class ,t1oo.getId());
          ????????t1oo.setName(
          " google " );
          ????????
          try ?{
          ????????????tr2.commit();????
          ????????}?
          catch ?(Exception?e)?{
          ????????????System.out.println(
          " //err:?update(t1oo)->DB?中數(shù)據(jù)庫(kù)中沒有?t1oo?// " );
          ????????}
          ????????

          ????????System.out.println(
          " ?一級(jí)緩存清空前? " + ?session.get(T1oo. class ,t1oo.getId())?);
          ????????session.evict(t1oo);
          ????????System.out.println(
          " ?一級(jí)緩存清空后? " + ?session.get(T1oo. class ,t1oo.getId())?);
          ????????
          ????????
          // 不把t1oo?id?為空,否則當(dāng)在saveOrUpdate時(shí)候就會(huì)以為是游離態(tài)?update了
          ????????t1oo.setId( null );
          ????????
          // id=null?insert?調(diào)用
          ????????session.saveOrUpdate(t1oo);????????
          ????????tr2.commit();
          ????????
          ????Transaction?tr3?
          = ?session.beginTransaction();
          ????????session.delete(t1oo);
          ????????tr3.commit();
          ????????
          ????????session.close();
          ????????HibernateSessionFactory.closeSession();
          ????????
          ????}
          結(jié)果是:
          ********************ExecuteUpdate************************
          log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
          log4j:WARN Please initialize the log4j system properly.

          Hibernate: insert into t1oo (name, id) values (?, ?)
          Hibernate: delete from t1oo
          //err: 有級(jí)聯(lián) 單使用 delete T1oo 還要delete T2oo.aid = T1oo.id//
          Hibernate: select t1oo0_.id as id, t1oo0_.name as name0_ from t1oo t1oo0_
          Hibernate: delete from t2oo where aid=?
          Hibernate: delete from t2oo where aid=?
          Hibernate: delete from t2oo where aid=?
          Hibernate: delete from t1oo
          Hibernate: update t1oo set name=? where id=?
          //err: update(t1oo)->DB 中數(shù)據(jù)庫(kù)中沒有 t1oo //
          ?一級(jí)緩存清空前 hbn.bean.T1oo@287
          Hibernate: select t1oo0_.id as id0_, t1oo0_.name as name0_0_ from t1oo t1oo0_ where t1oo0_.id=?
          ?一級(jí)緩存清空后 null
          Hibernate: insert into t1oo (name, id) values (?, ?)
          Hibernate: delete from t1oo where id=?


          Get Load 區(qū)別 :
          ?
          ????/**?Get?Load?區(qū)別?(在commit前要?session.flush())
          ?????*?Table?->?T1oo(id,name)
          ?????*?1.如果未能發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法會(huì)拋出異常
          ?????*?2.Load方法可返回實(shí)體的代理類實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類。
          ?????*?3.load方法可以充分利用內(nèi)部緩存和二級(jí)緩存中的現(xiàn)有數(shù)據(jù),而get方法則僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找,
          ?????*?????????????如沒有發(fā)現(xiàn)對(duì)應(yīng)數(shù)據(jù),將越過二級(jí)緩存,直接調(diào)用SQL完成數(shù)據(jù)讀取。?
          ?????
          */
          ????
          public?void?testGetLoad()?throws?Exception?{
          ????????System.out.println(
          "\r\n\r\n********************Get<>Load************************");
          ????????Session?session?
          =?HibernateSessionFactory.currentSession();
          ????
          //??數(shù)據(jù)準(zhǔn)備
          ????????T1oo?t1oo?=?new?T1oo();
          ????????t1oo.setName(
          "liu");
          ????Transaction?t1?
          =?session.beginTransaction();
          ????????session.saveOrUpdate(t1oo);
          ????????
          //?為什么這會(huì)錯(cuò)?
          ????????
          //session.evict(t1oo);
          ????????
          //session.flush();
          ????????t1.commit();
          ????????session.evict(t1oo);
          ????
          ????Transaction?t2?
          =?session.beginTransaction();
          ????????System.out.println(
          "一級(jí)緩存是否有t1oo(load)->"+session.contains(t1oo));?
          ????????
          //這時(shí)候t1oo為?CGlib生成的代理類
          ????????t1oo?=?(T1oo)session.load(T1oo.class,t1oo.getId());
          ????????System.out.println(
          "?延遲加載出現(xiàn):select..?t1oo0_.id=??表的其他屬性加載?");
          ????????t1oo.setName(
          "load?list");
          ????????
          //后在?update
          ????????t2.commit();
          ????????session.evict(t1oo);
          ????????
          ????Transaction?t3?
          =?session.beginTransaction();
          ????????System.out.println(
          "一級(jí)緩存是否有t1oo(get)->"+session.contains(t1oo));?
          ????????
          //這時(shí)候t1oo為?CGlib生成的代理類
          ????????t1oo?=?(T1oo)session.get(T1oo.class,t1oo.getId());
          ????????System.out.println(
          "?沒有延遲加載出現(xiàn)");
          ????????t1oo.setName(
          "get?list");
          ????????
          //后在?update
          ????????t3.commit();????
          ????????session.evict(t1oo);
          ????????
          ????Transaction?tr3?
          =?session.beginTransaction();
          ????????session.delete(t1oo);
          ????????tr3.commit();
          ????????
          ????????session.close();
          ????????HibernateSessionFactory.closeSession();
          ????????
          ????}
          結(jié)果
          ********************Get<>Load************************
          Hibernate: insert into t1oo (name, id) values (?, ?)
          一級(jí)緩存是否有t1oo(load)->false
          ?延遲加載出現(xiàn):select.. t1oo0_.id=? 表的其他屬性加載
          Hibernate: select t1oo0_.id as id0_, t1oo0_.name as name0_0_ from t1oo t1oo0_ where t1oo0_.id=?
          Hibernate: update t1oo set name=? where id=?
          一級(jí)緩存是否有t1oo(get)->false
          Hibernate: select t1oo0_.id as id0_, t1oo0_.name as name0_0_ from t1oo t1oo0_ where t1oo0_.id=?
          ?沒有延遲加載出現(xiàn)
          Hibernate: update t1oo set name=? where id=?
          Hibernate: select t2ooset0_.aid as aid1_, t2ooset0_.id as id1_, t2ooset0_.id as id0_, t2ooset0_.avg as avg1_0_, t2ooset0_.aid as aid1_0_ from t2oo t2ooset0_ where t2ooset0_.aid=?
          Hibernate: delete from t1oo where id=?


          Set 集合的識(shí)別

          ????/**?Set?集合的識(shí)別
          ?????*?Table?->?T1oo(id,name)
          ?????*?Table?->?T2oo(id,avg,aid)
          ?????*?外鍵?T1oo.id->T2oo.aid
          ?????*?T1oo??<set?name="t2ooSet"?inverse="false"?cascade?=?"all"??>
          ?????*?T2oo??<many-to-one?name="t1oo"?column="aid"?class="T1oo"?/>
          ?????*?cascade='insert'?是一定要的
          ?????*?????當(dāng)?T1oo沒有?inverse="true"?主動(dòng)權(quán)的時(shí)候,要雙項(xiàng)關(guān)聯(lián)
          ?????*?????t1oo.getT2ooSet().add(t2oo1);
          ?????*????t1oo.getT2ooSet().add(t2oo2);
          ?????*????t2oo1.setT1oo(t1oo);
          ?????*????t2oo2.setT1oo(t1oo);
          ?????*??要不后sql為:
          ?????*??Hibernate:?insert?into?t2oo?(avg,?aid,?id)?values?(?,??,??)
          ?????*????Hibernate:?insert?into?t2oo?(avg,?aid,?id)?values?(?,??,??)
          ?????*????+----+-----+------+
          ?????*????|?id?|?avg?|?aid??|
          ?????*????+----+-----+------+
          ?????*????|??1?|??24?|?NULL?|
          ?????*????|??2?|??23?|?NULL?|
          ?????*????+----+-----+------+
          ?????*????當(dāng)?T1oo有?inverse="false"主動(dòng)權(quán)的時(shí)候
          ?????*??t1oo.getT2ooSet().add(t2oo1);
          ?????*????t1oo.getT2ooSet().add(t2oo2);
          ?????*??Sql語(yǔ)句為:
          ?????*??Hibernate:?insert?into?t1oo?(name,?id)?values?(?,??)
          ?????*????Hibernate:?insert?into?t2oo?(avg,?aid,?id)?values?(?,??,??)
          ?????*????Hibernate:?insert?into?t2oo?(avg,?aid,?id)?values?(?,??,??)
          ?????*????Hibernate:?update?t2oo?set?aid=??where?id=?
          ?????*????Hibernate:?update?t2oo?set?aid=??where?id=?
          ?????*????|??3?|??24?|???12?|
          ?????*????|??4?|??23?|???12?|
          ?????*????+----+-----+------+
          ????
          */
          ????
          public?void?testSet(){
          ????????System.out.println(
          "\r\n\r\n********************Set************************");
          ????????T1oo?t1oo?
          =?new?T1oo();
          ????????t1oo.setName(
          "list");
          ????????
          ????????T2oo?t2oo1?
          =?new?T2oo();?t2oo1.setAvg(new?Integer(23));
          ????????T2oo?t2oo2?
          =?new?T2oo();?t2oo2.setAvg(new?Integer(24));
          ????????
          ????????
          ????????Session?session?
          =?HibernateSessionFactory.currentSession();
          ????????Transaction?tr1?
          =?session.beginTransaction();
          ????????session.save(t1oo);
          ????????t1oo?
          =?(T1oo)?session.load(T1oo.class,t1oo.getId());

          ????????t1oo.setT2ooSet(
          new?HashSet())?;
          ????????t1oo.getT2ooSet().add(t2oo1);
          ????????t1oo.getT2ooSet().add(t2oo2);
          ?????????
          ????????System.out.println(?t1oo.getT2ooSet().size()
          +""?);????????
          ????????tr1.commit();
          ????????
          ????????System.out.println();
          ????????T2oo?t2oo3?
          =?new?T2oo();?t2oo3.setAvg(new?Integer(25));
          ????????T1oo?t1oo2?
          =?new?T1oo();?t1oo2.setName("mz");
          ????????t2oo3.setT1oo(t1oo2);
          ????????
          ????????Transaction?tr2?
          =?session.beginTransaction();
          ????????session.save(t2oo3);
          ????????
          try?{
          ????????????tr2.commit();????
          ????????}?
          catch?(Exception?e)?{
          ????????????System.out.println(
          "//err:?沒有主動(dòng)權(quán)?cascade?=?'all'?不可以級(jí)聯(lián)save?t1oo???//");
          ????????}
          ????????session.close();
          ????????HibernateSessionFactory.closeSession();
          ????}
          ???

          結(jié)果是:
          ********************Set************************
          2
          Hibernate: insert into t1oo (name, id) values (?, ?)
          Hibernate: insert into t2oo (avg, aid, id) values (?, ?, ?)
          Hibernate: insert into t2oo (avg, aid, id) values (?, ?, ?)
          Hibernate: update t2oo set aid=? where id=?
          Hibernate: update t2oo set aid=? where id=?

          //err: 沒有主動(dòng)權(quán) cascade = 'all' 不可以級(jí)聯(lián)save t1oo?? //



          評(píng)論

          # re: hibernate 部分問題總結(jié)——1  回復(fù)  更多評(píng)論   

          2007-11-19 20:04 by 對(duì)象輔導(dǎo)員
          不錯(cuò),收藏

          # re: hibernate 部分問題總結(jié)——1[未登錄]  回復(fù)  更多評(píng)論   

          2009-02-14 11:23 by dd
          session.close();
          HibernateSessionFactory.closeSession();
          為什么要調(diào)用兩次

          # re: hibernate 部分問題總結(jié)——1  回復(fù)  更多評(píng)論   

          2009-02-16 09:27 by Skynet
          第一次 session.close(); 為本線程的session關(guān)閉

          HibernateSessionFactory.closeSession(); 第二次為 全部連接斷開
          主站蜘蛛池模板: 清苑县| 甘肃省| 宁陵县| 华坪县| 福清市| 南通市| 灌阳县| 吉林省| 鄂托克旗| 镶黄旗| 江达县| 神农架林区| 韩城市| 陆丰市| 望奎县| 孝义市| 甘洛县| 南川市| 柳林县| 方城县| 霍城县| 西峡县| 贞丰县| 太保市| 会昌县| 泽库县| 荆州市| 海晏县| 故城县| 建阳市| 资中县| 麟游县| 武强县| 孝义市| 汽车| 衢州市| 泰顺县| 肇州县| 奉新县| 固阳县| 任丘市|