posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          hibernate 部分問題總結——1

          Posted on 2007-11-12 16:29 G_G 閱讀(2075) 評論(3)  編輯  收藏 所屬分類: hibernate
          緩存問題:
          ???? /** ?使用?Query.executeUpdate()?緩存中數據不同步?解決辦法
          ?????*??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)?一級緩存中?加載
          ????????session.saveOrUpdate(t1oo);?
          ????????
          // 直接一條語句刪除T1oo,緩存無法同步
          ????????
          // 一級緩存中還有?t1
          ????????Query?qu? = ?session.createQuery( " delete?T1oo " );
          ????????
          try ?{
          ????????????qu.executeUpdate();
          ????????}?
          catch ?(Exception?e)?{????
          ????????????System.out.println(
          " //err:?有級聯?單使用?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();
          ????????
          // 這直接通過一級緩存中加載t2,但DB中以沒有此條數據
          ????????t1oo? = ?(T1oo)session.load(T1oo. class ,t1oo.getId());
          ????????t1oo.setName(
          " google " );
          ????????
          try ?{
          ????????????tr2.commit();????
          ????????}?
          catch ?(Exception?e)?{
          ????????????System.out.println(
          " //err:?update(t1oo)->DB?中數據庫中沒有?t1oo?// " );
          ????????}
          ????????

          ????????System.out.println(
          " ?一級緩存清空前? " + ?session.get(T1oo. class ,t1oo.getId())?);
          ????????session.evict(t1oo);
          ????????System.out.println(
          " ?一級緩存清空后? " + ?session.get(T1oo. class ,t1oo.getId())?);
          ????????
          ????????
          // 不把t1oo?id?為空,否則當在saveOrUpdate時候就會以為是游離態(tài)?update了
          ????????t1oo.setId( null );
          ????????
          // id=null?insert?調用
          ????????session.saveOrUpdate(t1oo);????????
          ????????tr2.commit();
          ????????
          ????Transaction?tr3?
          = ?session.beginTransaction();
          ????????session.delete(t1oo);
          ????????tr3.commit();
          ????????
          ????????session.close();
          ????????HibernateSessionFactory.closeSession();
          ????????
          ????}
          結果是:
          ********************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: 有級聯 單使用 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 中數據庫中沒有 t1oo //
          ?一級緩存清空前 hbn.bean.T1oo@287
          Hibernate: select t1oo0_.id as id0_, t1oo0_.name as name0_0_ from t1oo t1oo0_ where t1oo0_.id=?
          ?一級緩存清空后 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ā)現符合條件的記錄,get方法返回null,而load方法會拋出異常
          ?????*?2.Load方法可返回實體的代理類實例,而get方法永遠直接返回實體類。
          ?????*?3.load方法可以充分利用內部緩存和二級緩存中的現有數據,而get方法則僅僅在內部緩存中進行數據查找,
          ?????*?????????????如沒有發(fā)現對應數據,將越過二級緩存,直接調用SQL完成數據讀取。?
          ?????
          */
          ????
          public?void?testGetLoad()?throws?Exception?{
          ????????System.out.println(
          "\r\n\r\n********************Get<>Load************************");
          ????????Session?session?
          =?HibernateSessionFactory.currentSession();
          ????
          //??數據準備
          ????????T1oo?t1oo?=?new?T1oo();
          ????????t1oo.setName(
          "liu");
          ????Transaction?t1?
          =?session.beginTransaction();
          ????????session.saveOrUpdate(t1oo);
          ????????
          //?為什么這會錯?
          ????????
          //session.evict(t1oo);
          ????????
          //session.flush();
          ????????t1.commit();
          ????????session.evict(t1oo);
          ????
          ????Transaction?t2?
          =?session.beginTransaction();
          ????????System.out.println(
          "一級緩存是否有t1oo(load)->"+session.contains(t1oo));?
          ????????
          //這時候t1oo為?CGlib生成的代理類
          ????????t1oo?=?(T1oo)session.load(T1oo.class,t1oo.getId());
          ????????System.out.println(
          "?延遲加載出現:select..?t1oo0_.id=??表的其他屬性加載?");
          ????????t1oo.setName(
          "load?list");
          ????????
          //后在?update
          ????????t2.commit();
          ????????session.evict(t1oo);
          ????????
          ????Transaction?t3?
          =?session.beginTransaction();
          ????????System.out.println(
          "一級緩存是否有t1oo(get)->"+session.contains(t1oo));?
          ????????
          //這時候t1oo為?CGlib生成的代理類
          ????????t1oo?=?(T1oo)session.get(T1oo.class,t1oo.getId());
          ????????System.out.println(
          "?沒有延遲加載出現");
          ????????t1oo.setName(
          "get?list");
          ????????
          //后在?update
          ????????t3.commit();????
          ????????session.evict(t1oo);
          ????????
          ????Transaction?tr3?
          =?session.beginTransaction();
          ????????session.delete(t1oo);
          ????????tr3.commit();
          ????????
          ????????session.close();
          ????????HibernateSessionFactory.closeSession();
          ????????
          ????}
          結果
          ********************Get<>Load************************
          Hibernate: insert into t1oo (name, id) values (?, ?)
          一級緩存是否有t1oo(load)->false
          ?延遲加載出現: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=?
          一級緩存是否有t1oo(get)->false
          Hibernate: select t1oo0_.id as id0_, t1oo0_.name as name0_0_ from t1oo t1oo0_ where t1oo0_.id=?
          ?沒有延遲加載出現
          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 集合的識別

          ????/**?Set?集合的識別
          ?????*?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'?是一定要的
          ?????*?????當?T1oo沒有?inverse="true"?主動權的時候,要雙項關聯
          ?????*?????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?|
          ?????*????+----+-----+------+
          ?????*????當?T1oo有?inverse="false"主動權的時候
          ?????*??t1oo.getT2ooSet().add(t2oo1);
          ?????*????t1oo.getT2ooSet().add(t2oo2);
          ?????*??Sql語句為:
          ?????*??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:?沒有主動權?cascade?=?'all'?不可以級聯save?t1oo???//");
          ????????}
          ????????session.close();
          ????????HibernateSessionFactory.closeSession();
          ????}
          ???

          結果是:
          ********************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: 沒有主動權 cascade = 'all' 不可以級聯save t1oo?? //



          評論

          # re: hibernate 部分問題總結——1  回復  更多評論   

          2007-11-19 20:04 by 對象輔導員
          不錯,收藏

          # re: hibernate 部分問題總結——1[未登錄]  回復  更多評論   

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

          # re: hibernate 部分問題總結——1  回復  更多評論   

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

          HibernateSessionFactory.closeSession(); 第二次為 全部連接斷開
          主站蜘蛛池模板: 青海省| 阳谷县| 仙居县| 宁远县| 石城县| 江油市| 沾益县| 咸宁市| 和硕县| 新龙县| 泸定县| 青田县| 涿鹿县| 德格县| 廊坊市| 贺州市| 泗阳县| 盐池县| 德保县| 囊谦县| 舞阳县| 博乐市| 新巴尔虎右旗| 闽侯县| 仲巴县| 敦化市| 蒙阴县| 类乌齐县| 娱乐| 休宁县| 漳浦县| 东丰县| 通辽市| 肇源县| 新巴尔虎右旗| 闽侯县| 海林市| 延庆县| 宁陕县| 商水县| 托克托县|