關於EJB--實體Bean的BMP和CMP選擇

EJB有兩種主要類型BMP(Bean managed persistence )和CMP(Container managed persistence ),這兩種類型各有優缺點。 

BMP是在Bean中完成對數據庫JDBC的各類調用,也就是說,在你的實體bean(entity bean)中,明確寫入了SQL語句,如"insert .. "或"select ..",而且使用Datasource得到一個數據庫資源以及鏈接(connection)從而對數據庫直接進行增長刪除修改。 

CMP是由EJB容器自動完成對數據庫的操做,你全部作的,就是在實體bean重寫入SetXXX或getXXX方法,而後在ejb-jar.xml中定義cmp-field就能夠。 

很明顯,CMP編寫要簡單多,並且數據庫操做由EJB容器完成應該是一種趨勢,可是CMP有個缺點就是不夠靈活,若是咱們要完成相似SQL搜索語句的like命令,如"select * from A where name like '%banqiao'",CMP就沒法自動幫助咱們完成,這樣咱們就須要BMP本身來寫。 

在實際應用,通常爲了效率考慮,咱們儘可能使用CMP,但如何爲未來有可能使用BMP做好準備,就是說有能夠延伸到BMP的基礎。EJB 2.0對CMP的抽象類支持爲咱們提供了這種實現的基礎。 

整體思路是,先使用抽象類完成CMP 若是須要BMP 能夠extend這個抽象類,而後覆蓋原來的方法(用本身的特殊SQL語句操做來覆蓋該方法)。 

以Java 寵物店(Java Pet Store Demo 1.3)中的地址實體bean:AddressEJB爲例: java

Java代碼   收藏代碼
  1. public abstract class AddressEJB implements EntityBean {  
  2.     private EntityContext context = null;  
  3.   
  4.     // getters and setters for PO CMP fields  
  5.   
  6.     public abstract String getFirstName();  
  7.     public abstract void setFirstName(String name);  
  8.     public abstract String getLastName();  
  9.     public abstract void setLastName(String name);  
  10.     public abstract String getStreet1();  
  11.     public abstract void setStreet1(String name);  
  12.     public abstract String getStreet2();  
  13.     public abstract void setStreet2(String name);  
  14.     public abstract String getCity();  
  15.     public abstract void setCity(String name);  
  16.     public abstract String getState();  
  17.     public abstract void setState(String name);  
  18.     public abstract String getCountry();  
  19.     public abstract void setCountry(String name);  
  20.     public abstract String getZip();  
  21.     public abstract void setZip(String name);  
  22.   
  23.     public Object ejbCreate(  
  24.         String fName,  
  25.         String lName,  
  26.         String s1,  
  27.         String s2,  
  28.         String cy,  
  29.         String st,  
  30.         String cnty,  
  31.         String pcode)  
  32.         throws CreateException {  
  33.         setFirstName(fName);  
  34.         setLastName(lName);  
  35.         setStreet1(s1);  
  36.         setStreet2(s2);  
  37.         setCity(cy);  
  38.         setState(st);  
  39.         setCountry(cnty);  
  40.         setZip(pcode);  
  41.         return null;  
  42.     }  
  43.   
  44.     public void ejbPostCreate(  
  45.         String fName,  
  46.         String lName,  
  47.         String street1,  
  48.         String street2,  
  49.         String city,  
  50.         String state,  
  51.         String country,  
  52.         String zip)  
  53.         throws CreateException {  
  54.     }  
  55.     public void setEntityContext(EntityContext c) {  
  56.         context = c;  
  57.     }  
  58.     public void unsetEntityContext() {  
  59.     }  
  60.     public void ejbRemove() throws RemoveException {  
  61.     }  
  62.     public void ejbActivate() {  
  63.     }  
  64.     public void ejbPassivate() {  
  65.     }  
  66.     public void ejbStore() {  
  67.     }  
  68.     public void ejbLoad() {  
  69.     }  
  70. }  


在上面的AddressEJB中,咱們看到只有setXXX或getXXX的方法。 

在相應的部署描述文件ejb-jar.xml中咱們看到: 數據庫

Java代碼   收藏代碼
  1. <entity>  
  2.   <display-name>AddressEJB</display-name>  
  3.   <ejb-name>AddressEJB</ejb-name>  
  4.   <local-home>com.sun.j2ee.blueprints.address.ejb.AddressLocalHome</local-home>  
  5.   <local>com.sun.j2ee.blueprints.address.ejb.AddressLocal</local>  
  6.   <ejb-class>com.sun.j2ee.blueprints.address.ejb.AddressEJB</ejb-class>  
  7.   <persistence-type>Container</persistence-type>  
  8.   <prim-key-class>java.lang.Object</prim-key-class>  
  9.   <reentrant>False</reentrant>  
  10.   <cmp-version>2.x</cmp-version>  
  11.   <abstract-schema-name>Address</abstract-schema-name>  
  12.   
  13.   
  14.   <cmp-field>  
  15.     <field-name>firstName</field-name>  
  16.   </cmp-field>  
  17.   <cmp-field>  
  18.     <field-name>lastName</field-name>  
  19.   </cmp-field>  
  20.   <cmp-field>  
  21.     <field-name>street1</field-name>  
  22.   </cmp-field>  
  23.   <cmp-field>  
  24.     <field-name>street2</field-name>  
  25.   </cmp-field>  
  26.   <cmp-field>  
  27.     <field-name>city</field-name>  
  28.   </cmp-field>  
  29.   <cmp-field>  
  30.     <field-name>state</field-name>  
  31.   </cmp-field>  
  32.   <cmp-field>  
  33.     <field-name>country</field-name>  
  34.   </cmp-field>  
  35.   <cmp-field>  
  36.     <field-name>zip</field-name>  
  37.   </cmp-field>  
  38.   
  39.   
  40.   <security-identity>  
  41.     <description></description>  
  42.     <use-caller-identity></use-caller-identity>  
  43.   </security-identity>  
  44.   
  45. </entity>  


在上面部署文件中,標明瞭Address數據庫字段: 

firstName,lastName,street1,street2,city,state,country,zip 

一旦咱們要使用BMP, 只要繼承上面的CMP bean: 

public class AddressBeanBMP extends AddressEJB { 

用咱們本身的BMP方法覆蓋AddressEJB中的方法: 

ejbLoad() -->從數據庫中獲取數據(SELECT) 
ejbStore() -->修改數據庫數據UPDATE) 
ejbRemove() -->刪除數據庫數據(DELETE) 
ejbCreate() -->插入新的數據記錄(INSERT) 
ejbFindByPrimaryKey(primary key) --> 確保 primary key 存在. 
ejbFindAllPrimaryKey() -->本身的定義 返回一個primary key全部數據記錄的collectionxiam 

下面以ejbCreate()爲例: 

ide

Java代碼   收藏代碼
    1. public Object ejbCreate(  
    2.     String fName,  
    3.     String lName,  
    4.     String s1,  
    5.     String s2,  
    6.     String cy,  
    7.     String st,  
    8.     String cnty,  
    9.     String pcode)  
    10.     throws CreateException {  
    11.   
    12.     // insert row into database  
    13.     this.fName = fName;  
    14.     this.lName = lName;  
    15.     this.s1 = s1;  
    16.     this.s2 = s2;  
    17.     this.cy = cy;  
    18.     this.st = st;  
    19.     this.cnty = cnty;  
    20.     this.pcode = pcode;  
    21.   
    22.     // Insert database record  
    23.     try {  
    24.         Connection connection = getConnection();  
    25.         PreparedStatement statement =  
    26.             connection.prepareStatement(  
    27.                 "INSERT INTO Address (firstName,lastName,street1,street2,city,state,country,zip) VALUES (?, ?, ?,?,?,?)");  
    28.         statement.setString(1, fName);  
    29.         statement.setString(2, lName);  
    30.         statement.setString(3, pcode);  
    31.         statement.setString(4, s1);  
    32.         statement.setString(5, s2);  
    33.         statement.setString(6, st);  
    34.         statement.setString(7, cy);  
    35.         statement.setString(8, cnty);  
    36.         if (statement.executeUpdate() != 1) {  
    37.             statement.close();  
    38.             connection.close();  
    39.             throw new CreateException("Could not create: ");  
    40.         }  
    41.         statement.close();  
    42.         connection.close();  
    43.     } catch (SQLException e) {  
    44.         throw new EJBException("Could not create: ");  
    45.     }  
    46. }  

 

轉自 http://gimgen1026.iteye.com/blog/148106this

相關文章
相關標籤/搜索