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 超越巔峰 閱讀(943) 評論(0)  編輯  收藏 所屬分類: Java EE

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 铁力市| 永吉县| 平江县| 富阳市| 凉城县| 三江| 平原县| 左权县| 华坪县| 东乡县| 高要市| 金塔县| SHOW| 克什克腾旗| 富平县| 西和县| 庆城县| 华阴市| 通渭县| 远安县| 通山县| 虹口区| 农安县| 温泉县| 高阳县| 阿合奇县| 安顺市| 阜新市| 泾阳县| 泰州市| 巍山| 修水县| 丹棱县| 和龙市| 江华| 长丰县| 钟山县| 尖扎县| 宁城县| 湘阴县| 慈利县|