J2EE之巔

           

          EJB中使用Hibernate的幾個問題辨析

          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,各方法的事務屬性是required
          客戶端調用tran以上代碼可以正確運行嗎?
          如果把tran1中的sf.getCurrentSession();改為sf.openSession()可以正確運行嗎?
          辨析:
          1 上述代碼是不能正確運行的,運行tran2時會拋出異常,告訴你session is closed.
          其實這是應為getCurrentSession()會使用環境已有的Session,同時注意getCurrentSession()要在事務的環境中使用。
          這是也許你一定會問,那么什么時候關閉Session呢?答案是事務完成的時候(提交或是回滾)。

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


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

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

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 同德县| 二连浩特市| 改则县| 嘉义县| 平原县| 辽中县| 华安县| 睢宁县| 永德县| 武汉市| 邯郸县| 雷波县| 吉林市| 青川县| 卓资县| 武鸣县| 元氏县| 永安市| 乐山市| 弥勒县| 尖扎县| 宽城| 苗栗市| 延庆县| 成安县| 宝坻区| 广德县| 商丘市| 东至县| 江源县| 出国| 乌苏市| 林口县| 晋城| 龙胜| 云南省| 吉水县| 吴旗县| 乌海市| 广宁县| 道真|