<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    Posted on 2007-11-12 16:29 G_G 閱讀(2082) 評(píng)論(3)  編輯  收藏 所屬分類: hibernate
    緩存問(wèn)題:
    ???? /** ?使用?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();
    ????????
    // 這直接通過(guò)一級(jí)緩存中加載t2,但DB中以沒(méi)有此條數(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ù)中沒(méi)有?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ù)中沒(méi)有 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ù)查找,
    ?????*?????????????如沒(méi)有發(fā)現(xiàn)對(duì)應(yīng)數(shù)據(jù),將越過(guò)二級(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(
    "?沒(méi)有延遲加載出現(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=?
    ?沒(méi)有延遲加載出現(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沒(méi)有?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:?沒(méi)有主動(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: 沒(méi)有主動(dòng)權(quán) cascade = 'all' 不可以級(jí)聯(lián)save t1oo?? //



    評(píng)論

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

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

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

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

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

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

    HibernateSessionFactory.closeSession(); 第二次為 全部連接斷開(kāi)
    主站蜘蛛池模板: 亚洲AⅤ优女AV综合久久久| 午夜免费国产体验区免费的| 亚洲人成无码久久电影网站| 日韩亚洲国产高清免费视频| 成人免费无码H在线观看不卡| 亚洲日韩精品国产3区 | 456亚洲人成在线播放网站| 亚洲欧洲国产精品香蕉网| 国产成人在线观看免费网站 | 又粗又大又硬又爽的免费视频| 免费观看无遮挡www的小视频| 人妻在线日韩免费视频| 无码免费又爽又高潮喷水的视频 | 91精品免费在线观看| a级毛片高清免费视频| 在线亚洲人成电影网站色www| 夫妻免费无码V看片| 无码精品A∨在线观看免费| 一区二区在线免费观看| 亚洲国产成人久久精品app| 亚洲av无码片在线播放| 超清首页国产亚洲丝袜| 亚洲AV无码乱码精品国产| 国产精品无码免费视频二三区| av无码国产在线看免费网站| 日本免费一区二区三区四区五六区| 中国在线观看免费的www| 九九99热免费最新版| 亚欧国产一级在线免费| 杨幂最新免费特级毛片| 精品视频免费在线| 久久亚洲欧美国产精品| 精品无码专区亚洲| 香港特级三A毛片免费观看| 美景之屋4在线未删减免费| 亚洲欧美在线x视频| 西西人体大胆免费视频| 一级毛片免费观看不收费| jizz免费一区二区三区| 中国一级全黄的免费观看| 国产麻豆一精品一AV一免费|