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

作者:网络 来源:佚名 更新时间:2008-02-09 00:26:06 点击:
ejb2.0终于给了我们一个可操作的容器管理持久(cmp)模型。只要有可能,在我的ejb项目中我就用cmp beans;但是,由于这件奇怪的事情,我需要把我的实体变成bean管理(bmp)的。我使用下面的模式让我干净利落的从cmp模型转换到bean管理持久模型。
在这篇文章中,我们将讨论:

1.cmp 2.0: 发生了什么变化?

2.inventory(货物清单)ejb应用程序

3.开发一个cmp bean

4.移植cmp bean到bmp

cmp 2.0: 发生了什么变化?

当ejb问世的时候,cmp引起了很大的反响,当ejb2.0问世的时候,又对cmp模型进行了修订,它给了我们真正想要的特性:诸如关系和查询语言标准化。

与ejb1.1相比,当我们用ejb2.0写一个cmp bean时,我们的写法有很大的不同。我们创建抽象类,而不是创建被容器管理变量的公共域,我们像javabean一样创建抽象的属性(getters and setters)。这准许特定厂商的持久性管理器用他们自己的方式实现数据访问器(accessors)。

这将帮助他们(厂商)提出像这样的逻辑:

●由于他们不调用任何set方法,所以在ejbstore()中不做任何动作

●他们仅仅改变一个域,所以我们只在update查询语句中set那个域

●我们延迟装载一些数据,所以当用户用get方法请求数据的时候我们才读取他

顺便提一个问题:为什么我们必须在抽象类中创建抽象方法?为什么持久性管理器不能在派生类中创建方法?

答:我们必须在抽象类中访问这些方法。例如:在ejbcreate()中,我们通过传入参数来set它们。

inventory ejb 应用程序

为了说明该实体模型,我们将看到一个简单的应用用该实体模型化该货物清单(inventory)系统。我们应用程序包括以下组成部分:

inventory实体bean: 这是我们的焦点。他将映射到数据库表inventory,该表纪录了条目的名字(主关键字),价格和仓库中条目的数目

价格无状态会话bean:该bean用inventory实体bean来得到条目的价格,它用本地(local)接口来访问该实体

价格客户: 这个命令行应用程序在会话(session)上运行该方法来测试所有工作都运行得很好

关键点是当我们把这个inventory实体从 cmp移植到bmp实现时候,什么也不要做改变

让我们看一下用cmp实现inventory实体

开发一个cmp bean

inventory cmp要我们创建一个抽象类(依照实体说明),xml描述文件告诉框架应该影射什么,图一说明了我们的条目看起来是什么样子





抽象实体bean

该抽象实体有下列属性:

实现了javax.ejb.entitybean接口

abstract public class inventorybean implements entitybean



实现在实体接口中声明的方法

public void setentitycontext(entitycontext context) {
ctx = context;
}
public void unsetentitycontext() {
ctx = null;
}
public void ejbactivate() {}
public void ejbpassivate() {}
public void ejbremove() throws removeexception {}
public void ejbstore() {}
public void ejbload() {}



实现ejbcreate()和ejbpostcreate()方法该方法对应于home接口中的create()方法(用抽象set方法set所有参数)

public string ejbcreate(string item, float price, int stock)
throws createexception {
setitem(item);
setprice(price);
setstock(stock);
return null;
}



public void ejbpostcreate(string item, float price, int stock) throws createexception {}

实现抽象get和set方法

public abstract string getitem();
public abstract void setitem(string item);
public abstract float getprice();
public abstract void setprice(float price);
public abstract int getstock();
public abstract void setstock(int stock);



实现一个助手方法来访问实体上下文(在后面的bmpbean中我们将用到它)

public entitycontext getentitycontext() {
return ctx;
}



ejb部署描述符

我们创建了一个cmp实体类,现在该创建部署描述符了.首先我们将创建一个标准的"ejb-jar.xml",然后我们需要配置与厂商有关的信息.我们将说明weblogic 6.1 部署描述符,我们选一个.

标准 ejb-jar.xml

基本的实体配置信息:

我们将配置类名,用局部变量,在实体内部它们是局部变量.我们通过持久类型xml标签告诉容器该实体是cmp

<entity>
<ejb-name>inventorybean</ejb-name>
<local-home>inventoryhome</local-home>
<local>inventory>/local<
<ejb-class>inventorybean</ejb-class>
<persistence-type>container</persistence-type>
<prim-key-class>java.lang.string</prim-key-class>
<reentrant>false</reentrant>



接着,我们将告诉容器那些域是容器管理的,item域是主键类[未完待续]