关于EJB--实体Bean的BMP和CMP选择
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: ");
- }
- }
转自 http://gimgen1026.iteye.com/blog/148106
关于EJB--实体Bean的BMP和CMP选择的更多相关文章
- EJB实体Bean怎样和数据库中表关联?
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC "- ...
- J2EE的十三个技术——EJB之实体Bean
概述: 实体Bean与会话Bean不同,实体Bean是持久的,即使应用程序结束,它仍然存在.它允许共享访问,具有主键. 组成: 1)本地(Local)接口 本地访问EJB,只有在EJB与客户在同一个应 ...
- EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)
一.为什么使用EJB ? 企业Bean执行在EJB容器中.企业Bean实际上就是一个封装了业务逻辑的Java类,那么我们为什么要使用EJB呢 ? 1.最重要的原因:分布式.简要的说,分布式能够 ...
- 持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接
在EJB 2.x中.EJB有3种类型的Bean.各自是会话Bean(Session Bean).消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean). 随 ...
- EJB_开发单表映射的实体bean
开发单表映射的实体bean 实体bean 它属于java持久化规范(JPA)里的技术,实体bean通过元数据在Javabean和数据库表之间建立起映射关系,然后Java程序员就可以随心所欲的使用面向对 ...
- hibernate查询部分字段转换成实体bean
//hibernate查询部分字段转换成实体bean /** * 查询线路信息 */ @Override public List<Line> getSimpleLineListByTj(M ...
- 谈谈序列化—实体bean一定要实现Serializable接口?
导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型.但是由于map每次都要匹配key值,很麻烦.所以在之后就将参数传递和返回类型全都改成了实体bean ...
- ABAP表生成Java实体Bean
项目中需要将HR模块中的表数据同步到Java系统中,向外围系统提供分发与查询服务,涉及到的表有两百多张,字段好几千上万个,如果手工一张张这些ABAP表在Java系统数据库中创建一遍的话,工作量将非常大 ...
- mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置
mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置 ============================== 蕃薯耀 2018年3月14 ...
随机推荐
- WebKit载入流程 - 概述
之前写了几篇载入流程的说明,是从下向上看,有点仅仅见树木不见森林的感觉.经过近期一段时间的学习,有了能加以概括抽象的方法. WebKit载入流程和页面组成是直接相关的,页面就是WebKit要载入的对象 ...
- 一起talk C栗子吧(第八十一回:C语言实例--进程停止)
各位看官们,大家好,上一回中咱们说的是进程相互排斥的样例,这一回咱们说的样例是:进程停止.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了怎样创建进程,只是没有介绍停止进 ...
- iOS 实现QQ界面
应师傅要求编写个QQ界面来不吝赐教下我的代码问题. 编写个QQ界面.有三个组,每一个组有人.并显示在线不在线. 先看一下效果图 这里省了事由于我的图片仅仅用了一张.假设要依据人的不同设置,仅仅要在ce ...
- C. Diverse Permutation(Codeforces Round #275(div2)
C. Diverse Permutation time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 使用maven运行单元測试总结
maven本身没有单元測试框架,可是maven的default生命周期的test阶段绑定了maven-surefire-plugin插件,该插件能够调用Junit3.Junit4.TestNG等Jav ...
- nodeJs学习路线
转载自:http://blog.fens.me/nodejs-roadmap/ 前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个. 和全部人一样,我也从 ...
- 15.Intellij中配置jdk/tomcat/maven
转自:https://blog.csdn.net/u010414666/article/details/44465905 继上一篇安装好了Intellij之后,我们可以对Intellij,做一些简单的 ...
- apache-maven-3.0.4-bin.zip
http://zhidao.baidu.com/share/2a8974fd1546ef5f11ad9cccb3cabf88.html apache-maven-3.0.4-bin.zip
- 参考《Python数据处理》中英文PDF+源代码
在实际操作中掌握数据处理方法,比较实用.采用基于项目的方法,介绍用Python完成数据获取.数据清洗.数据探索.数据呈现.数据规模化和自动化的过程.主要内容包括:Python基础知识,如何从CSV.E ...
- Python基础班培训视频课程
课程目录:│ ├─第01天视频│ │ 01-课程介绍.avi│ │ 02-什么是操作系统.avi│ │ 03-生活中的操作系统.avi│ │ 04-操 ...