`
gimgen1026
  • 浏览: 160078 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实体Bean的BMP和CMP选择

    博客分类:
  • Java
阅读更多
EJB有两种主要类型BMP(Bean managed persistence )和CMP(Container managed persistence ),这两种类型各有优缺点。

BMP是在Bean中完成对数据库JDBC的各种调用,也就是说,在你的实体bean(entity bean)中,明确写入了SQL语句,如"insert .. "或"select ..",并且使用Datasource获得一个数据库资源以及连接(connection)从而对数据库直接进行增加删除修改。

CMP是由EJB容器自动完成对数据库的操作,你所有做的,就是在实体bean重写入SetXXX或getXXX方法,然后在ejb-jar.xml中定义cmp-field就可以。

很明显,CMP编写要简单多,而且数据库操作由EJB容器完成应该是一种趋势,但是CMP有个缺点就是不够灵活,如果我们要完成类似SQL搜索语句的like命令,如"select * from A where name like '%banqiao'",CMP就无法自动帮助我们完成,这样我们就需要BMP自己来写。

在实际应用,一般为了效率考虑,我们尽量使用CMP,但如何为将来有可能使用BMP作好准备,就是说有可以延伸到BMP的基础。EJB 2.0对CMP的抽象类支持为我们提供了这种实现的基础。

总体思路是,先使用抽象类完成CMP 如果需要BMP 可以extend这个抽象类,然后覆盖原来的方法(用自己的特殊SQL语句操作来覆盖该方法)。

以Java 宠物店(Java Pet Store Demo 1.3)中的地址实体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的方法。

在相应的部署描述文件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>

在上面部署文件中,标明了Address数据库字段:

firstName,lastName,street1,street2,city,state,country,zip

一旦我们要使用BMP, 只要继承上面的CMP bean:

public class AddressBeanBMP extends AddressEJB {

用我们自己的BMP方法覆盖AddressEJB中的方法:

ejbLoad() -->从数据库中获取数据(SELECT)
ejbStore() -->修改数据库数据UPDATE)
ejbRemove() -->删除数据库数据(DELETE)
ejbCreate() -->插入新的数据记录(INSERT)
ejbFindByPrimaryKey(primary key) --> 确保 primary key 存在.
ejbFindAllPrimaryKey() -->自己的定义 返回一个primary key所有数据记录的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: ");
	}
}

分享到:
评论

相关推荐

    EJB实体Bean学习

    在这个“EJB实体Bean学习”主题中,我们将深入探讨实体Bean的两大类型——BMP(Business Managed Persistence)和CMP(Container Managed Persistence),以及如何进行基本的CRUD(创建、读取、更新和删除)操作。...

    Bean开发实例之三实体Bean开发实例

    ### 实体Bean开发实例 ...实体Bean的开发需要理解其基本理论,掌握CMP和BMP的区别,以及如何构建实体Bean的各种组成部分。通过合理的实体Bean设计和实现,可以有效地管理数据库中的数据,并支持复杂的业务需求。

    ejb实例包括session bean和实体bean

    2. **Container-managed Persistence (CMP)**:容器负责对象与数据库之间的持久化工作,开发者无需直接处理数据库操作,只需定义实体Bean的字段和属性。 3. **Entity Beans 3.0(EJB 3.0引入)**:简化了Entity Bean...

    EJB 3.0学习之实体Bean

    `entityType`定义Bean的管理类型,可选CMP(容器管理的持久化)和BMP(Bean管理的持久化);`access`定义了访问持久化数据的方式,可以是PROPERTY(通过getter和setter方法)或FIELD(直接访问字段)。同时,实体...

    EJB实体Bean与事物管理

    实体Bean有两种类型:Bean管理持久性(BMP)和容器管理持久性(CMP)。 - **Bean管理持久性**: BMP中,开发者负责管理Bean的持久性,包括连接数据库、执行SQL语句以及处理事务。 - **容器管理持久性**: CMP中,EJB...

    实战EJB之四 开发实体CMP(EJB 1.1规范) .doc

    在EJB 1.1规范中,实体Bean分为两种类型:容器管理持久性(Container-Managed Persistence, CMP)和Bean管理持久性(Bean-Managed Persistence, BMP)。本篇主要聚焦于CMP。 **容器管理持久性(CMP)**是EJB 1.1...

    EJB,有状态,无状态,实体bean笔记,及例子

    实体bean有两种形式:容器管理的持久性(CMP)和bean管理的持久性(BMP)。CMP由EJB容器负责数据的持久化,而BMP则将更多的控制权交给开发者,让开发者自己处理数据的存储和检索。 在实际应用中,EJB可以通过JNDI(Java...

    ejb2.rar_bmp ejb2_ejb2_ejb2 cmp b

    在 ejb2.rar_bmp ejb2_ejb2_ejb2 cmp b 这个压缩包中,我们看到的是针对EJB 2.1规范的一个登录实例,它涉及到了两种主要的实体Bean管理策略:CMP(Container-Managed Persistence,容器管理持久化)和 BMP(Bean-...

    EJB2.0 Entity bean(PDF) .zip_EJB2 enti_EJB2.0 P_ejb_ejb2 CMP sup

    在EJB 2.0中,实体Bean分为两种类型:CMP(容器管理持久性)和BMP(Bean管理持久性)。 #### 1.1 容器管理持久性(Container-Managed Persistence, CMP) CMP是EJB 2.0中的一个重要特性,它将数据管理的责任交给了...

    EJB3开发Entity

    EJB3的实体Bean有两种生命周期管理方式:容器管理的持久性(CMP)和bean管理的持久性(BMP)。EJB3更倾向于使用CMP,由容器负责对象的创建、初始化、持久化、查找和删除,开发者只需要关注业务逻辑。 5. **事务...

    EJB2.0 Entity bean(PDF)

    **企业级JavaBeans(EJB)2.0实体Bean**是Java平台中用于构建可部署在企业级服务器上的分布式、事务处理和持久性应用程序的重要组件。这个PDF文档,"EJB2.0 Entity bean",可能包含了关于如何设计、实现和使用EJB2.0...

    BMP-EJB.rar_EJB Entity

    在EJB中,实体Bean分为两种主要类型:CMP(容器管理的持久性)和BMP( bean管理的持久性)。这两种类型的实体Bean在处理数据持久化和事务管理时有不同的职责分配。 1. CMP(Container Managed Persistence): CMP...

    enterprise javabean 的cmp

    通过"使用ejb2.0 ql教程代码(cmp)"这个压缩包文件,你可以学习到如何在EJB 2.0环境中使用CMP和EJB QL进行数据库操作。这份资料可能包含实际的代码示例,展示了如何定义CMP实体Bean,编写EJB QL查询,以及如何在...

    EJB-CMP_CMR 介绍与深入

    尽管现代技术如Spring Data JPA和NoSQL数据库提供了更多选择,但理解EJB-CMP和CMR的概念对于全面掌握Java EE技术栈至关重要。这份“EJB-CMP_CMR介绍与深入”资料,无疑是深入了解和学习这一主题的宝贵资源。

    使用ejb2.0 ql教程代码(cmp)

    4. **CMP映射文件**:ejb-jar.xml或ejb-cmp.xml,定义了实体Bean与数据库表之间的映射关系,包括字段映射、主键生成策略等。 5. **主键(Primary Key)**:每个实体Bean都需要一个唯一的主键来标识,CMP提供了一些...

    EJB3.0 PPT

    实体Bean和消息驱动Bean的结合使用,能够构建出高效、健壮的企业级系统,实体Bean负责数据持久化和共享,而MDB则负责异步处理任务,提高系统的响应能力和可扩展性。 总结,EJB3.0通过实体Bean提供了对数据库数据的...

    ejb.rar_EJB PPT_cmp in EJB_ejb_java ppt_seam

    在EJB 2.x中,实体Bean分为两种:Bean管理持久性(BMP)和容器管理持久性(CMP)。**CMP(Container Managed Persistence)**是EJB 2.x中的特性,它让容器负责对象和数据库之间的映射,简化了开发者的任务。案例可能...

    免费的企业级EJB3.0高级培训ppt3

    10. **CMP和BMP的区别**: - CMP将持久性管理的职责交给了容器,开发人员无需关注数据库访问细节,但灵活性相对较低。 - BMP则让开发人员自己管理数据库访问,提供了更大的灵活性,但增加了开发复杂性。 通过理解...

    EJB必须掌握的概念

    此外,实体Bean还提供了多种本地接口方法,对应特定的SQL操作,如创建、更新、删除等,这些操作通常由容器或开发者根据选择的持久化策略(CMP或BMP)自动或手动执行。 ### 7. BMP与CMP的对比 BMP和CMP是实体Bean的...

    BMP学习EJBBMP学习EJB

    1. **实体Bean**:BMP中的实体Bean是业务对象,它代表数据库表中的一个记录。开发者需要在Bean中定义属性,这些属性对应数据库表的字段,并编写getter和setter方法。 2. **JDBC接口**:理解并熟练使用JDBC API是BMP...

Global site tag (gtag.js) - Google Analytics