| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > Java教程 > J2EEEJBJMS > 文章正文 用户登录
Feedsky首推话题广
Geesee广告计划详
5GBFreephp空间
Flash Lite 与 J2
对于TREE组件的一
Tween类以及深度9
KoaQiu组件教程之
On MouseEvent 滑
使用Tree组件制作
使用Transition和

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

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

作者:佚名 来源:http://www.j2eesp.com 更新:2006-8-25 21:05:35 错误报告 我要投稿
特定厂商的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模式


BMP实体bean 
 让我们看看这个即将成为BMPbean的bean类:
  扩展抽象CMPbean类:
 public class InventoryBeanBMP extends InventoryBean {}
  创建映射域:
 public String item;
  public float  price;
  public int    stock; 改写ejb*()系列方法:
  为了改写EJB方法,我们需要记住在BMP中我们对每一个方法所负的责任。
 
    大多数项目看起来是一样的,所以让我们看其中一个方法(你可以在所下载的代码中看到其余代码)

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做为最后的手段。

 部署例程注意事项:   
    你可以下载例程模式的代码。代码有两部分  BMP 和 CMP(它们有相同的目录),我们提供了一个例子创建脚本(build.cmd)来编译和部署该例程到BEA WebLogic 6.1。我们需要在脚本中改变一些目录路径让它运行。为了测试该应用可以在客户端运行命令:javac PricerClient。请仔细参阅README.txt 文件来得到更多的信息(如建立一个数据库表等)。
Dion Almaer是中间件公司主要技术人员和TheServerSide.Com J2EE 社区的首席架构师.

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。