posts - 66,  comments - 11,  trackbacks - 0

              實體Bean包含BMP和CMP兩種類型。對BMP實體Bean而言,開發(fā)者必須提供各自的數(shù)據(jù)訪問邏輯。為了實現(xiàn)BMP,通常會使用操作數(shù)據(jù)庫的API,比如JDBC.對于CMP實體Bean而言,EJB容器會自動實現(xiàn)數(shù)據(jù)訪問邏輯。這就是CMP的優(yōu)勢所在。通常,只有在應(yīng)用服務(wù)器提供的CMP和目標(biāo)RDBMS不能滿足性能要求時,才去考慮BMP.此時,開發(fā)者能夠細(xì)粒度調(diào)整BMP的性能。
              所有的實體Bean類必須實現(xiàn)javax.ejb.EntityBean接口,包括BMP、CMP.EntityBean接口定義了EJB容器對實體Bean組件進(jìn)行的回調(diào)方法,它還可能含有其他方法,比如創(chuàng)建實體Bean,查找實體Bean.
              同ejbCreate()一樣,finder方法在Home接口和Bean類中的方法簽名不相同:
          1、實體Bean實例返回主鍵給EJB容器,而Home對象返回EJB對象給客戶。
          2、Bean類和Home類中的finder方法簽名,除了Bean類存在ejb前綴外,其他都一樣。

              finder方法的工作機(jī)制:
          1、當(dāng)客戶調(diào)用Home對象的finder方法時,Home客戶請求實體Bean實例,替它查找到符合客戶要求的主鍵。隨后,實體Bean實例將返回主鍵集合給EJB容器。
          2、當(dāng)EJB容器接收到來自實體Bean實例的主鍵集合時,它將創(chuàng)建EJB對象結(jié)合。注意,它會為各個主鍵創(chuàng)建EJB對象。最后,容器將EJB對象放著在集合中,并返回給客戶。隨后,可以調(diào)用EJB對象中的方法了。每個EJB對象代表了各個實體Bean實例映射的RDBMS數(shù)據(jù)。
              finder方法需遵守如下規(guī)則:
          1、所有的finder方法必須以ejbFind開始
          2、實體Bean組件必須提供ejbFindByPrimarKey方法。通過該方法,能夠基于客戶提供的主鍵查找到RDBMS中的唯一記錄,并映射到實體Bean實例。由于各個實體Bean都存在主鍵,因此所有實體Bean的Bean類必須支持ejbFindByPrimaryKey方法。
          3、可以提供多個finder方法,而且他們的名字、參數(shù)都不一樣。因此,EJB客戶可以使用各種查找策略,以定位到相應(yīng)的實體Bean實例集合。
          4、查找方法必須返回實體Bean的主鍵。當(dāng)然,返回值有可能是單個主鍵,也可能是主鍵集合。

          package com.testproject.ejb.entity;

          import java.rmi.RemoteException;

          import javax.ejb.EJBObject;
          /*
           * 客戶將通過這一接口同EJB組件進(jìn)行交互。
           * EJB容器會實現(xiàn)這一接口。我們將接口實現(xiàn)稱之為EJB對象。
           * EJB對象會將請求委派給Bean類。
           
          */

          public interface Account extends EJBObject {
              
          /**
               * 將amt存入賬戶
               
          */

              
          public void deposit(double amt)throws RemoteException;
              
          /**
               * 從銀行賬戶去amount
               
          */

              
          public void withdraw(double amount)throws RemoteException;
              
          //getter/setter方法,對應(yīng)于持久化域
              public double getBalance()throws RemoteException;
              
          public String getOwnerName()throws RemoteException;
              
          public void setOwnerName(String name)throws RemoteException;
              
          public String getAccountID()throws RemoteException;
              
          public void setAccountId(String id)throws RemoteException;
          }


          package com.testproject.ejb.entity;

          import java.rmi.RemoteException;
          import java.util.Collection;

          import javax.ejb.CreateException;
          import javax.ejb.EJBHome;
          import javax.ejb.FinderException;
          /**
           * Account的Home接口。
           * EJB容器負(fù)責(zé)實現(xiàn)它,我們將這一接口的實現(xiàn)稱之為Home對象。
           * Home對象充當(dāng)了EJB對象的工廠。
           
          */

          public interface AccountHome extends EJBHome {
              
          /**
               * 此時,我們定義了單個create()方法。
               * 對應(yīng)于AccountBean中的ejbCreate()方法。它負(fù)責(zé)創(chuàng)建EJB對象。
               
          */

              Account create(String accountID,String ownerName)
          throws CreateException,RemoteException;
              
          /**
               * 通過主鍵,查找Account
               
          */

              
          public Account findByPrimaryKey(AccountPK key)throws FinderException,RemoteException;
              
          /**
               * 通過賬戶所有人,來查找他的所有賬戶
               
          */

              
          public Collection findByOwnerName(String name)throws FinderException,RemoteException;
              
          /**
               * Home業(yè)務(wù)方法獨(dú)立于任何帳號,它返回銀行帳號的總合。
               
          */

              
          public double getTotalBankValue()throws RemoteException;
              
          }



          package com.testproject.ejb.entity;

          import java.io.Serializable;
          /**
           * 注意:
           * 1、主鍵類含有簡單字符串a(chǎn)ccountID.它能夠唯一標(biāo)識銀行賬號。
           * 2、必須提供toString()方法。EJB容器將調(diào)用toString()方法,以獲得主鍵的字符串取值。
           * 3、必須提供hashCode()方法。一旦提供了hashCode()方法,就可以將主鍵類存放到Hashtable中。EJB
           * 容器需要hashCode()方法。在容器內(nèi)部,它可能使用Hashtable或類似結(jié)構(gòu),以存放內(nèi)存中的所有實體Bean實例
           * 并使用各個主鍵作為Hashtable的鍵(key)
           * 4、必須提供equals()方法。在容器比較2個緩存的實體Bean實例時,它會使用equals()方法來比較各自的主鍵是否相等。
           
          */

          public class AccountPK implements Serializable {
              
          public String accountID;
              
              
          public AccountPK(String id){
                  
          this.accountID = id;
              }

              
              
          public AccountPK(){}
              
              
          public String toString(){
                  
          return accountID;
              }


              
          public int hashCode(){
                  
          return accountID.hashCode();
              }

              
              
          public boolean equals(Object account){
                  
          if(!(account instanceof AccountPK))
                      
          return false;
                  
          return ((AccountPK)account).accountID.equals(accountID);
              }

          }



          package com.testproject.ejb.entity;

          import java.rmi.RemoteException;
          import java.sql.Connection;
          import java.sql.PreparedStatement;
          import java.sql.ResultSet;

          import javax.ejb.EJBException;
          import javax.ejb.EntityBean;
          import javax.ejb.EntityContext;
          import javax.ejb.RemoveException;
          import javax.naming.Context;
          import javax.naming.InitialContext;

          public class AccountBean implements EntityBean {
              
              
          protected EntityContext ctx;
              
              
          //BMP持久化域
              private String accountID;
              
          private String ownerName;
              
          private double balance;
              
              
          //業(yè)務(wù)邏輯方法
              /**
               * 將amt存入賬戶
               
          */

              
          public void deposit(double amt){
                  System.out.println(
          "deposit("+amt+")called");
                  balance 
          += amt;
              }

              
          /**
               * 從銀行賬戶去amount
               
          */

              
          public void withdraw(double amt){
                  System.out.println(
          "withdraw("+amt+")called");
                  
          if(amt>balance){
                      
                  }

                  balance 
          -= amt;
              }

              

              
          public String getAccountID() {
                  
          return accountID;
              }

              
          public void setAccountID(String accountID) {
                  
          this.accountID = accountID;
              }

              
          public String getOwnerName() {
                  
          return ownerName;
              }

              
          public void setOwnerName(String ownerName) {
                  
          this.ownerName = ownerName;
              }

              
          public double getBalance() {
                  
          return balance;
              }

              
              
          /**
               * Home業(yè)務(wù)方法獨(dú)立于任何賬號,它返回銀行賬號的總和
               
          */

              
          public double ejbHomeGetTotalBanValue()throws Exception{
                  PreparedStatement pstmt 
          = null;
                  Connection conn 
          = null;
                  
          double total = 0;
                  
          try{
                      System.out.println(
          "ejbHomeGetTotalBankValue()");
                      
          /*獲得數(shù)據(jù)庫連接*/
                      conn 
          = getConnection();
                      
          /*合計*/
                      pstmt 
          = conn.prepareStatement("select sum(balance) as total form accounts");
                      ResultSet rs 
          = pstmt.executeQuery();
                      
          if(rs.next()){
                           total 
          = rs.getDouble("total");
                      }

                  }
          catch(Exception e){
                      e.printStackTrace();
                      
          throw e;
                  }

                  
                  
          finally{
                      
          /*釋放資源*/
                      
          try{if(pstmt!=null)pstmt.close();}
                      
          catch(Exception e){}
                      
          try{if(conn!=null)conn.close();}
                      
          catch(Exception e){}
                  }

                  
          return total;
              }

              
          /**
               * 從連接池獲得JDBC連接
               
          */

              
          public Connection getConnection()throws Exception{
                  
          try{
                      Context ctx 
          = new InitialContext();
                      javax.sql.DataSource ds 
          = (javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/ejbPool");
                      
          return ds.getConnection();
                  }
          catch(Exception e){
                      e.printStackTrace();
                      
          throw e;
                  }

              }

              
          //回調(diào)方法先不寫了,實在太多
              public void ejbActivate() throws EJBException, RemoteException {
              }


              
          public void ejbLoad() throws EJBException, RemoteException {
              }


              
          public void ejbPassivate() throws EJBException, RemoteException {
              }


              
          public void ejbRemove() throws RemoveException, EJBException,
                      RemoteException 
          {
              }


              
          public void ejbStore() throws EJBException, RemoteException {
              }


              
          public void setEntityContext(EntityContext arg0) throws EJBException,
                      RemoteException 
          {
              }


              
          public void unsetEntityContext() throws EJBException, RemoteException {
              }


          }

          posted on 2009-11-21 12:32 王永慶 閱讀(220) 評論(0)  編輯  收藏 所屬分類: EJB學(xué)習(xí)筆記
          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關(guān)注blogs

          搜索

          •  

          最新評論

          • 1.?re: 心中的那個她[未登錄]
          • 如果心情能那么容易放開就好了,碰到她是我的緣分,但是她的緣分不知道在哪里。
          • --王永慶
          • 2.?re: 心中的那個她[未登錄]
          • 兄弟,喜歡就大膽去追好了,就是因為喜歡才會有不愉快,如果想一輩子沒有這些煩惱,找一個可有可無的人就好了。這種事講的是緣分吧。別人對你好不好其實不太重要。放開心情就好了。
          • --萍水相逢
          • 3.?re: 心中的那個她
          • 只能同甘不能共苦,就他媽算了吧,程序員也是人啊!我現(xiàn)在也很討厭女的不理解人情。
          • --咖啡妝
          • 4.?re: 難以割舍的那份情感
          • 評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
          • --王永慶
          • 5.?re: 難以割舍的那份情感
          • 評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
          • --隔葉黃鶯

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 缙云县| 尚志市| 郑州市| 洮南市| 正镶白旗| 五寨县| 原平市| 平遥县| 临海市| 宁波市| 平南县| 安阳县| 蒙城县| 喀喇沁旗| 安塞县| 萨迦县| 兴化市| 双柏县| 巢湖市| 金塔县| 石城县| 盈江县| 扶余县| 西华县| 日土县| 广西| 白山市| 崇义县| 荆门市| 县级市| 道真| 出国| 梅河口市| 东宁县| 永嘉县| 任丘市| 巴马| 永和县| 阿克陶县| 巩留县| 林周县|