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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊(cè)

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 邹平县| 新干县| 连城县| 凌海市| 肇州县| 克什克腾旗| 雷山县| 桐乡市| 阳信县| 五指山市| 泽库县| 盐城市| 四川省| 泊头市| 伊金霍洛旗| 普宁市| 泸定县| 曲阜市| 吉首市| 清新县| 永宁县| 子长县| 乌拉特中旗| 长岛县| 太仆寺旗| 仙游县| 马鞍山市| 阳高县| 阳原县| 北辰区| 若羌县| 马龙县| 无棣县| 裕民县| 郴州市| 宁南县| 石河子市| 呼伦贝尔市| 绍兴县| 凌云县| 托克逊县|