分享
 
 
 

J2EE设计模式:CMP到BMP模式(二)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

特定厂商的weblogic-ejb-jar.xml

我们首先在weblogic-ejb-jar.xml中定义厂商特定的信息。在这里我们告诉服务器在哪儿存放本地存根(stub)和哪儿去查找CMP映射。

持久映射信息:

<persistence-type>

<type-identifier>WebLogic_CMP_RDBMS</type-identifier>

<type-version>6.0</type-version>

<type-storage>META-INF/weblogic-cmp-rdbms-jar.xml<

/type-storage>

</persistence-type>

本地JNDI名字

<local-jndi-name>InventoryHome</local-jndi-name>

特定厂商的weblogic-cmp-rdbms-jar.xml

数据源(datasource)名称:(这个数据源在配置的时候被创建)

<data-source-name>InventoryDB</data-source-name>

表(table)名:

<table-name>inventory</table-name>

域(field)映射

<field-map>

<cmp-field>stock</cmp-field>

<dbms-column>stock</dbms-column>

</field-map>

<field-map>

<cmp-field>item</cmp-field>

<dbms-column>item</dbms-column>

</field-map>

<field-map>

<cmp-field>price</cmp-field>

<dbms-column>price</dbms-column>

</field-map>

现在我们有了我们想要得一切。容器将利用抽象类和部署信息来使一切工作的很好。由于某些原因,我们可能让这个CMPbean移植到BMP。以下是为什么我们要这样做的原因

1.可移植性:当前,它只工作在WebLogic 6.1,,而我们并不想学习其他的工具。这非常正常如果我们想卖这个数据库组件的话--它能够运行在任何服务器上。

2.性能:如果我们想很好的运行SQL(用存储过程,表的联合等等)。

3.可替换的数据源:如果我们想访问不同的数据源而不是RDBMS。

用BMP移植Bean

这里我们将讨论移植模式。我们可以通过“变成持久管理器“模式将CMP移植到BMP。我们可以看到持久管理器扩展了我们创建的抽象类并实现了抽象类的方法!最终的设计看起来如图二:

BMP实体bean

让我们看看这个即将成为BMPbean的bean类:

扩展抽象CMPbean类:

public class InventoryBeanBMP extends InventoryBean {}

创建映射域:

public String item;

public float price;

public int stock; 改写ejb*()系列方法:

为了改写EJB方法,我们需要记住在BMP中我们对每一个方法所负的责任

方法 责任

ejbLoad() 从数据库中读取数据 (SELECT)

ejbStore() 更新数据库中的数据 (UPDATE)

ejbRemove() 从数据库中删除数据(DELETE)

ejbCreate() 插入新的数据(INSERT)

ejbFindByPrimaryKey(primary key) 确认主键存在

ejbFindAllPrices() 为每一项返回一个主键的collection

大多数项目看起来是一样的,所以让我们看其中一个方法(你可以在所下载的代码中看到其余代码)

public String ejbCreate(String item, float price, int stock) throws CreateException {

// insert row into database

this.item = item;

this.price = price;

this.stock = stock;

// 插入数据库记录

try {

Connection connection = getConnection();

PreparedStatement statement = connection.prepareStatement

("INSERT INTO inventory (item, price, stock) valueS (?, ?, ?)");

statement.setString(1, item);

statement.setFloat(2, price);

statement.setInt(3, stock);

if (statement.executeUpdate() != 1) {

statement.close();

connection.close();

throw new CreateException("Could not create: " + item);

}

statement.close();

connection.close();

return item;

}

catch(SQLException e) {

throw new EJBException("Could not create: " + item, e);

}

}

实现get 和set方法:

public String getItem() {

return this.item;

}

public void setItem(String item) {

this.item = item;

}

public float getPrice() {

return this.price;

}

public void setPrice(float price) {

this.price = price;

}

public int getStock() {

return this.stock;

}

public void setStock(int stock) {

this.stock = stock;

}

辅助函数得到一个JDBC连接:

private Connection getConnection() throws SQLException {

DataSource ds = null;

try {

Context ctx = new InitialContext();

ds = (DataSource) ctx.lookup ("java:comp/env/jdbc/InventoryDB")

} catch (NamingException exp) {

exp.printStackTrace()

}

return (ds == null) ? null : ds.getConnection();

}

EJB部署描述符

标准ejb-jar.xml

从CMP转换成BMP时要改变部署环境:

class指向BMP类而不是抽象类,我们要让容器知道我们自己管理持久:

<ejb-class>InventoryBeanBMP</ejb-class>

<persistence-type>Bean</persistence-type>

加入JDBC数据源引用:(在上面getConnection()方法中使用)

<resource-ref>

<res-ref-name>jdbc/InventoryDB</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

厂商特定的 weblogic-ejb-jar.xml:

<reference-descriptor>

<resource-description>

<res-ref-name>jdbc/InventoryDB</res-ref-name>

<jndi-name>inventoryDB</jndi-name>

</resource-description>

</reference-descriptor>

我们不必过多地关心厂商特定的文件,正如我们在CMP中所做的。我们需要指定本地JNDI名称(与以前一样),我们需要指出数据源的本地地址,它部署在应用服务器中。我们已经重用了抽象类,改写它满足我们所需要得BMP实现,然后把我们的部署描述符打包

结论:

我们已经研究了能干净利落让CMP转换为BMP实现的模式。我们的BMP实现只是简单的扩展了CMP抽象bean类然后让它运行!注意到我们以相同的逻辑加入了get/set方法以确保我们在ejbStore()中不做任何动作,或者做一个查询。我们仍就要记住尽可能的用CMPbean,BMP做为最后的手段[完]

原文:http://www.onjava.com/pub/a/onjava/2002/04/10/j2eedesign.html

【关于作者】

本文由minpeng_2001翻译,minpeng_2001,j2ee的忠实fans.可以点击http://www.matrix.org.cn/user_view.asp?username=minpeng_2001查看他的信息.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有