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

j2ee|设计

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域是主键类[未完待续]

时间: 2024-12-31 02:29:31

J2EE设计模式:CMP到BMP模式(一)的相关文章

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

j2ee|设计 特定厂商的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><ty

IssueVision 学习笔记(三)-----设计模式之OBSERVER(观察者)模式

server|笔记|设计 这次我们来看看IssueVision中的对设计模式的应用,IssueVision主要使用了OBSERVER(观察者)模式和COMMAND(命令)模式.今天就来看看OBSERVER(观察者)模式在IssueVision中的应用,它在IssueVision中扮演着重要角色. "四人帮"GoF是这样定义OBSERVER(观察者)模式的------定义对象间的一种一对多的关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知,并被自动更新. 从定义可以看出,OB

设计模式之观察者(Observer)模式与其C++通用实现(下)

我们在<设计模式之观察者(Observer)模式与其C++通用实现(中)>一文中给出了一个以C++语言实现的通用观察者模式方案骨架.然而,实际的工程项目需求往往要比理想状态复杂得多,此篇便是与读者一起探讨在现实世界中可能遇到的各种棘手问题及解决方案. 我把目前为止我所遇到的问题罗列如下: 复合主题 多线程 更新方法修改观察者链表 接下来我们一一给予讨论. (一)复合主题 考虑GUI的组件设计,我习惯用Widget类代表之,它需要处理许多用户交互以及系统事件,其中最常见的用户交互事件有鼠标及键盘

PHP设计模式之装饰者模式代码实例

  这篇文章主要介绍了PHP设计模式之装饰者模式代码实例,装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能,本文就给出了代码实例,需要的朋友可以参考下 定义: 装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能.传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多. 角色: Component(被装饰对象基类) ConcreteComponent(具体被装饰对象) Decorator(装饰者基类) Contret

深入理解JavaScript系列(29):设计模式之装饰者模式详解

 这篇文章主要介绍了深入理解JavaScript系列(29):设计模式之装饰者模式详解,装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数),需要的朋友可以参考下     介绍 装饰者提供比继承更有弹性的替代方案. 装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数). 装饰者用于通过重载方法的形式添加新功能,该模式可以在被装饰者前面或者后面加上自己的行为以达到特定的目的.

javascript设计模式中的工厂模式示例

 这篇文章主要介绍了javascript设计模式中的工厂模式示例讲解,需要的朋友可以参考下 javaScript工厂方式原始的方式   因为对象的属性可以在对象创建后动态定义,这在 JavaScript 最初引入时都会编写类似下面的代码   代码如下: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() {   alert(this.

设计模式: 简单工厂模式

引入: 在我们的思维中,会有一种习惯,当遇到某种问题时,会直接考虑用最直接的语言去去实现它,而往往忽略了整个程序的可维护性.可扩展性. 比如,我们写一个基本的计算器功能,要求能计算四则运算,大家或许会直接写: public class ProgramDemo{ public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(

乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) 作者:webabcd 介绍 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例 有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel usi

C#设计模式(3)——工厂方法模式

原文:C#设计模式(3)--工厂方法模式 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的. 二.工厂方法模式的实现 工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这