posts - 66,  comments - 11,  trackbacks - 0

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

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

          package com.testproject.ejb.entity;

          import java.rmi.RemoteException;

          import javax.ejb.EJBObject;
          /*
           * 客戶將通過這一接口同EJB組件進(jìn)行交互。
           * EJB容器會(huì)實(shí)現(xiàn)這一接口。我們將接口實(shí)現(xiàn)稱之為EJB對象。
           * EJB對象會(huì)將請求委派給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é)實(shí)現(xiàn)它,我們將這一接口的實(shí)現(xiàn)稱之為Home對象。
           * Home對象充當(dāng)了EJB對象的工廠。
           
          */

          public interface AccountHome extends EJBHome {
              
          /**
               * 此時(shí),我們定義了單個(gè)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)存中的所有實(shí)體Bean實(shí)例
           * 并使用各個(gè)主鍵作為Hashtable的鍵(key)
           * 4、必須提供equals()方法。在容器比較2個(gè)緩存的實(shí)體Bean實(shí)例時(shí),它會(huì)使用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();
                      
          /*合計(jì)*/
                      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)方法先不寫了,實(shí)在太多
              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 王永慶 閱讀(219) 評論(0)  編輯  收藏 所屬分類: EJB學(xué)習(xí)筆記
          <2009年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關(guān)注blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 泗阳县| 正安县| 定襄县| 罗源县| 南宁市| 永兴县| 织金县| 凭祥市| 上林县| 武平县| 溧阳市| 临西县| 罗江县| 莆田市| 洛扎县| 慈溪市| 红原县| 体育| 宜君县| 绥棱县| 桃源县| 乌拉特中旗| 江油市| 印江| 和林格尔县| 沧州市| 嘉兴市| 临沧市| 中超| 横峰县| 富阳市| 汶上县| 泌阳县| 丹阳市| 泗阳县| 青龙| 剑阁县| 松溪县| 巴林左旗| 新宁县| 溧阳市|