EJB有兩種主要類(lèi)型BMP(Bean managed persistence )和CMP(Container managed persistence ),這兩種類(lèi)型各有優(yōu)缺點(diǎn)。
BMP是在Bean中完成對(duì)數(shù)據(jù)庫(kù)JDBC的各種調(diào)用,也就是說(shuō),在你的實(shí)體bean(entity bean)中,明確寫(xiě)入了SQL語(yǔ)句,如"insert .. "或"select ..",并且使用Datasource獲得一個(gè)數(shù)據(jù)庫(kù)資源以及連接(connection)從而對(duì)數(shù)據(jù)庫(kù)直接進(jìn)行增加 刪除修改。
CMP是由EJB容器自動(dòng)完成對(duì)數(shù)據(jù)庫(kù)的操作,你所有做的,就是在實(shí)體bean重寫(xiě)入SetXXX或getXXX方法,然后在ejb-jar.xml中定義cmp-field就可以。
很明顯,CMP編寫(xiě)要簡(jiǎn)單多,而且數(shù)據(jù)庫(kù)操作由EJB容器完成應(yīng)該是一種趨勢(shì),但是CMP有個(gè)缺點(diǎn)就是不夠靈活,如果我們要完成類(lèi)似SQL搜索語(yǔ)句的like命令,如"select * from A where name like '%banqiao'",CMP就無(wú)法自動(dòng)幫助我們完成,這樣我們就需要BMP自己來(lái)寫(xiě)。
在實(shí)際應(yīng)用,一般為了效率考慮,我們盡量使用CMP,但如何為將來(lái)有可能使用BMP作好準(zhǔn)備,就是說(shuō)有可以延伸到BMP的基礎(chǔ)。EJB 2.0對(duì)CMP的抽象類(lèi)支持為我們提供了這種實(shí)現(xiàn)的基礎(chǔ)。
總體思路是,先使用抽象類(lèi)完成CMP 如果需要BMP 可以extend這個(gè)抽象類(lèi),然后覆蓋原來(lái)的方法(用自己的特殊SQL語(yǔ)句操作來(lái)覆蓋該方法)。
以Java 寵物店(Java Pet Store Demo 1.3)中的地址實(shí)體bean:AddressEJB為例:
public abstract class AddressEJB implements EntityBean {
private EntityContext context = null;
// getters and setters for PO CMP fields
public abstract String getFirstName();
public abstract void setFirstName(String name);
public abstract String getLastName();
public abstract void setLastName(String name);
public abstract String getStreet1();
public abstract void setStreet1(String name);
public abstract String getStreet2();
public abstract void setStreet2(String name);
public abstract String getCity();
public abstract void setCity(String name);
public abstract String getState();
public abstract void setState(String name);
public abstract String getCountry();
public abstract void setCountry(String name);
public abstract String getZip();
public abstract void setZip(String name);
public Object ejbCreate(String fName, String lName, String s1,
String s2, String cy, String st,
String cnty, String pcode)
throws CreateException {
setFirstName(fName);
setLastName(lName);
setStreet1(s1);
setStreet2(s2);
setCity(cy);
setState(st);
setCountry(cnty);
setZip(pcode);
return null;
}
public void ejbPostCreate(String fName, String lName, String street1,
String street2, String city, String state,
String country, String zip)
throws CreateException{}
public void setEntityContext(EntityContext c){ context = c; }
public void unsetEntityContext(){}
public void ejbRemove() throws RemoveException {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void ejbStore() {}
public void ejbLoad() {}
}
在上面的AddressEJB中,我們看到只有setXXX或getXXX的方法。
在相應(yīng)的部署描述文件ejb-jar.xml中我們看到:
<entity>
<display-name>AddressEJB</display-name>
<ejb-name>AddressEJB</ejb-name>
<local-home>com.sun.j2ee.blueprints.address.ejb.AddressLocalHome</local-home>
<local>com.sun.j2ee.blueprints.address.ejb.AddressLocal</local>
<ejb-class>com.sun.j2ee.blueprints.address.ejb.AddressEJB</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Object</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Address</abstract-schema-name>
<cmp-field>
<field-name>firstName</field-name>
</cmp-field>
<cmp-field>
<field-name>lastName</field-name>
</cmp-field>
<cmp-field>
<field-name>street1</field-name>
</cmp-field>
<cmp-field>
<field-name>street2</field-name>
</cmp-field>
<cmp-field>
<field-name>city</field-name>
</cmp-field>
<cmp-field>
<field-name>state</field-name>
</cmp-field>
<cmp-field>
<field-name>country</field-name>
</cmp-field>
<cmp-field>
<field-name>zip</field-name>
</cmp-field>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</entity>
在上面部署文件中,標(biāo)明了Address數(shù)據(jù)庫(kù)字段:
firstName,lastName,street1,street2,city,state,country,zip
一旦我們要使用BMP, 只要繼承上面的CMP bean:
public class AddressBeanBMP extends AddressEJB {
用我們自己的BMP方法覆蓋AddressEJB中的方法:
ejbLoad() -->從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)(SELECT)
ejbStore() -->修改數(shù)據(jù)庫(kù)數(shù)據(jù)UPDATE)
ejbRemove() -->刪除數(shù)據(jù)庫(kù)數(shù)據(jù)(DELETE)
ejbCreate() -->插入新的數(shù)據(jù)記錄(INSERT)
ejbFindByPrimaryKey(primary key) --> 確保 primary key 存在.
ejbFindAllPrimaryKey() -->自己的定義 返回一個(gè)primary key所有數(shù)據(jù)記錄的collectionxiam
下面以ejbCreate()為例:
public Object ejbCreate(String fName, String lName, String s1,
String s2, String cy, String st,
String cnty, String pcode) throws CreateException {
// insert row into database
this.fName = fName;
this.lName = lName;
this.s1 = s1;
this.s2 = s2;
this.cy=cy;
this.st=st;
this.cnty=cnty;
this.pcode=pcode;
// Insert database record
try {
Connection connection = getConnection();
PreparedStatement statement = connection.prepareStatement
("INSERT INTO Address (firstName,lastName,street1,street2,city,state,country,zip) VALUES (?, ?, ?,?,?,?)");
statement.setString(1, fName);
statement.setString(2, lName);
statement.setString(3, pcode);
statement.setString(4, s1);
statement.setString(5, s2);
statement.setString(6, st);
statement.setString(7, cy);
statement.setString(8, cnty);
if (statement.executeUpdate() != 1) {
statement.close();
connection.close();
throw new CreateException("Could not create: " );
}
statement.close();
connection.close();
}
catch(SQLException e) {
throw new EJBException("Could not create: " );
}
}
實(shí)體Bean的BMP和CMP選擇
更新時(shí)間: 2007-05-14 09:17:41來(lái)源: 粵嵌教育瀏覽量:770
粵嵌動(dòng)態(tài)
推薦閱讀
- ·Linux字符設(shè)備驅(qū)動(dòng)框架解析:file_operations的核心作用與實(shí)現(xiàn)
- ·廣東朝歌數(shù)碼科技股份有限公司專(zhuān)場(chǎng)招聘會(huì)
- ·深化產(chǎn)教融合,共筑技能人才培養(yǎng)新生態(tài) —— 廣州華立學(xué)院到訪粵嵌從化校區(qū)為深化產(chǎn)教
- ·校企合作新突破 | 粵嵌科技與三亞學(xué)院共探產(chǎn)教融合新路徑
- ·粵嵌科技入選國(guó)家級(jí)職業(yè)數(shù)字展館聯(lián)合建設(shè)單位,賦能計(jì)算機(jī)程序設(shè)計(jì)員高技能人才培養(yǎng)
- ·嵌入式實(shí)時(shí)操作系統(tǒng)的性能優(yōu)化與實(shí)現(xiàn)路徑
- ·校企攜手賦能教育!粵嵌科技助力海南科技職業(yè)大學(xué)探索 AGI 時(shí)代教學(xué)新范式
- ·嵌入式系統(tǒng)中的低功耗設(shè)計(jì)策略與實(shí)現(xiàn)路徑
- ·深圳市軒宇軟件開(kāi)發(fā)有限公司專(zhuān)場(chǎng)招聘會(huì)
- ·嵌入式系統(tǒng)中的代碼空間優(yōu)化:策略與實(shí)踐