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

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

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

    J2EE之巔

     

    EJB中使用Hibernate的幾個(gè)問(wèn)題辨析

    public class HibernateTestBean implements SessionBean {
        SessionContext sessionContext;
        SessionFactory sf;
        public void setSessionContext(SessionContext sessionContext) {
            this.sessionContext = sessionContext;
            try {
                InitialContext ctx = new InitialContext();
                sf=(SessionFactory) ctx.lookup("java:/hibernate/SessionFactory");
            } catch (NamingException ex) {
                ex.printStackTrace();
            }
        }
        public void tran(){
            tran1();
            tran2();
           
        }
        public void tran1() {
            Session session=sf.getCurrentSession();
            Message msg=new Message();
            msg.setCreateTime(new Date());
            msg.setDetail("trans1");
            session.save(msg);
            System.out.println("Session:"+session.hashCode());
            session.flush();
            session.close();
        }
        public void tran2() {
          Session session=sf.getCurrentSession();
          Message msg=new Message();
          msg.setCreateTime(new Date());
          msg.setDetail("trans2");
          session.save(msg);
           System.out.println("Session:"+session.hashCode());
        //  throw new RuntimeException("wrong");
      }
    ……
    }
    注:EJB采用CMT,各方法的事務(wù)屬性是required
    客戶端調(diào)用tran以上代碼可以正確運(yùn)行嗎?
    如果把tran1中的sf.getCurrentSession();改為sf.openSession()可以正確運(yùn)行嗎?
    辨析:
    1 上述代碼是不能正確運(yùn)行的,運(yùn)行tran2時(shí)會(huì)拋出異常,告訴你session is closed.
    其實(shí)這是應(yīng)為getCurrentSession()會(huì)使用環(huán)境已有的Session,同時(shí)注意getCurrentSession()要在事務(wù)的環(huán)境中使用。
    這是也許你一定會(huì)問(wèn),那么什么時(shí)候關(guān)閉Session呢?答案是事務(wù)完成的時(shí)候(提交或是回滾)。

    2 如果上述代碼tran1中的sf.getCurrentSession();改為sf.openSession()代碼將可以正確運(yùn)行。這是因?yàn)閛penSession()每次都會(huì)返回一個(gè)新的Session。而在tran2種的sf.getCurrentSession()并不會(huì)使用tran1中的session,而是會(huì)使用當(dāng)前事務(wù)環(huán)境中的默認(rèn)的session.
    也許你會(huì)問(wèn)如果tran2種的調(diào)用拋出RuntimeException,tran1所作的操作還可以回滾嗎?
    答案是仍然可以回滾的.


    蔡超
    北京天融信 軟件架構(gòu)師
    SCEA,SCBCD,MCSD
    IBM Certified Specialist RUP v2003
    IBM Certified Solution Designer OOA&D UMLv2

    posted on 2007-08-19 19:44 超越巔峰 閱讀(944) 評(píng)論(0)  編輯  收藏 所屬分類: Java EE

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(12)

    隨筆分類(54)

    隨筆檔案(59)

    文章分類(2)

    文章檔案(1)

    相冊(cè)

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲精品美女在线观看播放| 伊人婷婷综合缴情亚洲五月| 亚洲宅男天堂a在线| 免费看搞黄视频网站| 国产亚洲成av片在线观看| 三上悠亚在线观看免费| 亚洲精品高清国产一线久久| 在线播放免费人成毛片乱码| 日本亚洲视频在线| 99久久免费中文字幕精品| 亚洲成aⅴ人片在线影院八| 91情侣在线精品国产免费| 亚洲已满18点击进入在线观看| 在线精品免费视频| 国产精品亚洲а∨无码播放不卡 | 在线免费观看国产视频| 亚洲AV永久无码精品一福利| 四虎影视永久免费观看网址| 在线播放国产不卡免费视频| 亚洲婷婷五月综合狠狠爱| 外国成人网在线观看免费视频| 亚洲熟妇色自偷自拍另类| 在线免费一区二区| 免费中文字幕视频| 久久精品国产亚洲av高清漫画| 99久久免费精品国产72精品九九| 蜜芽亚洲av无码一区二区三区| 久久乐国产精品亚洲综合| 无码人妻丰满熟妇区免费| 亚洲色偷偷偷综合网| 亚洲а∨天堂久久精品| 日本视频免费高清一本18| 国产亚洲精品bv在线观看| 亚洲成av人片一区二区三区| 免费国产叼嘿视频大全网站| 男人天堂2018亚洲男人天堂| 亚洲精品tv久久久久| 免费观看激色视频网站(性色)| 另类专区另类专区亚洲| 亚洲短视频男人的影院| 国产免费一区二区三区VR|