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为例:

  1. public abstract class AddressEJB implements EntityBean {
  2. private EntityContext context = null;
  3. // getters and setters for PO CMP fields
  4. public abstract String getFirstName();
  5. public abstract void setFirstName(String name);
  6. public abstract String getLastName();
  7. public abstract void setLastName(String name);
  8. public abstract String getStreet1();
  9. public abstract void setStreet1(String name);
  10. public abstract String getStreet2();
  11. public abstract void setStreet2(String name);
  12. public abstract String getCity();
  13. public abstract void setCity(String name);
  14. public abstract String getState();
  15. public abstract void setState(String name);
  16. public abstract String getCountry();
  17. public abstract void setCountry(String name);
  18. public abstract String getZip();
  19. public abstract void setZip(String name);
  20. public Object ejbCreate(
  21. String fName,
  22. String lName,
  23. String s1,
  24. String s2,
  25. String cy,
  26. String st,
  27. String cnty,
  28. String pcode)
  29. throws CreateException {
  30. setFirstName(fName);
  31. setLastName(lName);
  32. setStreet1(s1);
  33. setStreet2(s2);
  34. setCity(cy);
  35. setState(st);
  36. setCountry(cnty);
  37. setZip(pcode);
  38. return null;
  39. }
  40. public void ejbPostCreate(
  41. String fName,
  42. String lName,
  43. String street1,
  44. String street2,
  45. String city,
  46. String state,
  47. String country,
  48. String zip)
  49. throws CreateException {
  50. }
  51. public void setEntityContext(EntityContext c) {
  52. context = c;
  53. }
  54. public void unsetEntityContext() {
  55. }
  56. public void ejbRemove() throws RemoveException {
  57. }
  58. public void ejbActivate() {
  59. }
  60. public void ejbPassivate() {
  61. }
  62. public void ejbStore() {
  63. }
  64. public void ejbLoad() {
  65. }
  66. }

在上面的AddressEJB中,我们看到只有setXXX或getXXX的方法。

在相应的部署描述文件ejb-jar.xml中我们看到:

  1. <entity>
  2.   <display-name>AddressEJB</display-name>
  3.   <ejb-name>AddressEJB</ejb-name>
  4.   <local-home>com.sun.j2ee.blueprints.address.ejb.AddressLocalHome</local-home>
  5.   <local>com.sun.j2ee.blueprints.address.ejb.AddressLocal</local>
  6.   <ejb-class>com.sun.j2ee.blueprints.address.ejb.AddressEJB</ejb-class>
  7.   <persistence-type>Container</persistence-type>
  8.   <prim-key-class>java.lang.Object</prim-key-class>
  9.   <reentrant>False</reentrant>
  10.   <cmp-version>2.x</cmp-version>
  11.   <abstract-schema-name>Address</abstract-schema-name>
  12.   <cmp-field>
  13.     <field-name>firstName</field-name>
  14.   </cmp-field>
  15.   <cmp-field>
  16.     <field-name>lastName</field-name>
  17.   </cmp-field>
  18.   <cmp-field>
  19.     <field-name>street1</field-name>
  20.   </cmp-field>
  21.   <cmp-field>
  22.     <field-name>street2</field-name>
  23.   </cmp-field>
  24.   <cmp-field>
  25.     <field-name>city</field-name>
  26.   </cmp-field>
  27.   <cmp-field>
  28.     <field-name>state</field-name>
  29.   </cmp-field>
  30.   <cmp-field>
  31.     <field-name>country</field-name>
  32.   </cmp-field>
  33.   <cmp-field>
  34.     <field-name>zip</field-name>
  35.   </cmp-field>
  36.   <security-identity>
  37.     <description></description>
  38.     <use-caller-identity></use-caller-identity>
  39.   </security-identity>
  40. </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()为例:

    1. public Object ejbCreate(
    2. String fName,
    3. String lName,
    4. String s1,
    5. String s2,
    6. String cy,
    7. String st,
    8. String cnty,
    9. String pcode)
    10. throws CreateException {
    11. // insert row into database
    12. this.fName = fName;
    13. this.lName = lName;
    14. this.s1 = s1;
    15. this.s2 = s2;
    16. this.cy = cy;
    17. this.st = st;
    18. this.cnty = cnty;
    19. this.pcode = pcode;
    20. // Insert database record
    21. try {
    22. Connection connection = getConnection();
    23. PreparedStatement statement =
    24. connection.prepareStatement(
    25. "INSERT INTO Address (firstName,lastName,street1,street2,city,state,country,zip) VALUES (?, ?, ?,?,?,?)");
    26. statement.setString(1, fName);
    27. statement.setString(2, lName);
    28. statement.setString(3, pcode);
    29. statement.setString(4, s1);
    30. statement.setString(5, s2);
    31. statement.setString(6, st);
    32. statement.setString(7, cy);
    33. statement.setString(8, cnty);
    34. if (statement.executeUpdate() != 1) {
    35. statement.close();
    36. connection.close();
    37. throw new CreateException("Could not create: ");
    38. }
    39. statement.close();
    40. connection.close();
    41. } catch (SQLException e) {
    42. throw new EJBException("Could not create: ");
    43. }
    44. }

转自 http://gimgen1026.iteye.com/blog/148106

关于EJB--实体Bean的BMP和CMP选择的更多相关文章

  1. EJB实体Bean怎样和数据库中表关联?

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC "- ...

  2. J2EE的十三个技术——EJB之实体Bean

    概述: 实体Bean与会话Bean不同,实体Bean是持久的,即使应用程序结束,它仍然存在.它允许共享访问,具有主键. 组成: 1)本地(Local)接口 本地访问EJB,只有在EJB与客户在同一个应 ...

  3. EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)

        一.为什么使用EJB ? 企业Bean执行在EJB容器中.企业Bean实际上就是一个封装了业务逻辑的Java类,那么我们为什么要使用EJB呢 ? 1.最重要的原因:分布式.简要的说,分布式能够 ...

  4. 持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接

    在EJB 2.x中.EJB有3种类型的Bean.各自是会话Bean(Session Bean).消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean). 随 ...

  5. EJB_开发单表映射的实体bean

    开发单表映射的实体bean 实体bean 它属于java持久化规范(JPA)里的技术,实体bean通过元数据在Javabean和数据库表之间建立起映射关系,然后Java程序员就可以随心所欲的使用面向对 ...

  6. hibernate查询部分字段转换成实体bean

    //hibernate查询部分字段转换成实体bean /** * 查询线路信息 */ @Override public List<Line> getSimpleLineListByTj(M ...

  7. 谈谈序列化—实体bean一定要实现Serializable接口?

    导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型.但是由于map每次都要匹配key值,很麻烦.所以在之后就将参数传递和返回类型全都改成了实体bean ...

  8. ABAP表生成Java实体Bean

    项目中需要将HR模块中的表数据同步到Java系统中,向外围系统提供分发与查询服务,涉及到的表有两百多张,字段好几千上万个,如果手工一张张这些ABAP表在Java系统数据库中创建一遍的话,工作量将非常大 ...

  9. mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置

    mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置 ============================== 蕃薯耀 2018年3月14 ...

随机推荐

  1. 适用于OpenGL离屏渲染上下文的初始化代码

    说明 近期做图像算法.须要用到shader对图像进行处理,用glut会有窗体,不适合写成UT測试用例,须要创建一个无窗体的OpenGL上下文. 代码 这部分代码事实上是參考 Android的Skia ...

  2. vue.2.0-路由

    vue2.0 路由: http://router.vuejs.org/zh-cn/index.html 基本使用: 1. 布局 <router-link to="/home" ...

  3. Android中App可分配内存的大小

    现在真实测试结果: 1,为了搞清楚每个应用程序在Android系统中最多可分配多少内存空间,我们使用了真机进行测试,测试机型为魅族MX4 Pro,3G内存. 测试方法是直接申请一块较大的内存空间,看应 ...

  4. Hexo High一下以及压缩排版问题

    背景介绍 集成Hight一下以及Gulp-html压缩之后出现的问题: High一下功能多次点击,会创建多个Audio对象,导致同时播放多次音乐,重音.解决办法:判断是否添加Audio对象,如果存在则 ...

  5. img下面的留白解决

    在做网页的时候经常会出现一个令人困惑的现象.那就是行内元素和块级元素之间会出现“留白”.就是块级元素中明明只有一个行内元素,但行内元素却不会铺满块级元素.像这个例子: “留白”出现的原因 行内元素默认 ...

  6. 五十个UI设计资源网站

    五十个UI设计资源网站 用户体验团队网站 1.UCD大社区 http://ucdchina.com/ 2.腾讯WSD http://wsd.tencent.com/ 3.腾讯CDC http://cd ...

  7. SQL Server 函数的使用 Function

    create table student ( id varchar2(5) primary key, name varchar2(20) not null, sex char(2) check(sex ...

  8. js---13 this call apply

    //this:this可以写在js全剧环境中(全局环境中this是window对象),this可以写在函数中,可以写在对象中, function f(){ this.name = "asdf ...

  9. 圆形头像CircleImageView和Cardview使用

    效果: 圆形头像在我们的日常使用的app中很常见,因为圆形的头像比较美观. 使用圆形图片的方法可能有我们直接将图片裁剪成圆形再在app中使用, 还有就是使用自定义View对我们设置的任何图片自动裁剪成 ...

  10. POJ 2437 贪心+priority_queue

    题意: 思路: 贪心 能不覆盖的就不盖 写得很乱 左闭右开的 temp //By SiriusRen #include <queue> #include <cstdio> #i ...