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

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 益阳市| 岢岚县| 汉源县| 陕西省| 大城县| 桂林市| 故城县| 东乌珠穆沁旗| 景德镇市| 格尔木市| 邯郸市| 和龙市| 潢川县| 江陵县| 那曲县| 田东县| 增城市| 平塘县| 砚山县| 江陵县| 通榆县| 宜兰县| 清涧县| 固始县| 晋中市| 綦江县| 沁源县| 阿勒泰市| 远安县| 黔东| 福清市| 周至县| 乌拉特后旗| 博乐市| 广德县| 铜梁县| 华亭县| 桃园市| 右玉县| 沽源县| 定兴县|