CMP实体Bean的编写与部署

  • Post author:
  • Post category:其他



一、 前言




在前面一系列文章的上一节中,我们给出了编写BMP的方法,并详细述说了BMP与CMP的区别和共性。

BMP和CMP同属EJB2.x规范中定义的实体Bean(Entity Bean),一个实体Bean是由多个类和接口组成,我们可以认为一个实体Bean代表数据库中的一个表(姑且这么认为),一个实体Bean的一个具体对象代表该表中的一条记录。也就是说,实体Bean是位于数据库和用户应用之间的数据中间件,关于为什么非要搞这个中间件,我在上一节中己经给出了充分的理由说明。

这个数据中间件由EJB容器负责管理,具体来说也即:当实体Bean部署时,EJB容器通过ejbLoad()方法将数据表中的数据填充到实体Bean并产生实体Bean对象;当实体Bean对象要释放时,EJB容器就调用实体Bean的ejbStore()方法将实体Bean对象中的数据存入数据表中;通过以上两步可以保持数据库表与实体Bean数据中间件同步。

首先,以上的同步方法在BMP中由我们自己来描述,具体见上一节,而在我们的CMP中,这些同步方法由CMP自动实现。

其次,CMP实体Bean不含有显示声明的字段,如我们在上一节BMP的Bean文件中显示声明的几个字段在CMP中是没有的。但是,它们如何和数据库表中对应的呢?事情是这样的,虽然没有显示声明,我们可以假想它们还是实际存在的(它声明在部署描述符文件中),我们通过一系列的getter/setter方法来设置它们的值。在BMP中,由我们自己来编写getter/setter方法,在CMP中,我们只需将这些getter/setter方法声明成abstract类型的,由EJB容器根据我们的布署描述符自动生成,于是,我们在我们的CMP Bean中就可以调用它了。

同时,BMP中的查询方法和CMP中的查询方法的实现方式也不同,在BMP中,我们在Home接口中定义的所有的查询实体Bean的查找方法都是我们自己来实现其细节的。然而在CMP中,这些查找方法我们也可以在编写Bean时省略,然后我们在布署描述文件中通过一种叫EJB-QL的语言(它类似于简单的SQL查询语言)来定义这些查找方法。

下面,我将详细说明具体编程上,二者有何不同及如何在JBOSS中编写和部署CMP。


二、 编写和布署CMP的方法步骤及其与BMP的区别


具体来说,编写部署BMP和CMP有以下相同和几个不同的地方:

1、 均需首先在数据库中定义该实体Bean对应的数据表

2、 均需配置数据库连接池支持文件,具体来说,请参见本系列教程之二——数据库连接池的配置与测试。这一步使得EJB容器可以通过连接池连接到数据库。

3、 编写Remote接口,这个CMP和BMP相同,均是编写一些暴露给远程调用的方法的声明,如商务逻辑方法。

4、 编写Home接口,这个CMP和BMP也相同,均是定义一些Home接口上的查询方法,注意,每一个实体Bean至少需要一个findByPrimaryKey(PK)方法。只不过,这里定义的查找方法在BMP中是由Bean类实现的,在CMP中,它们不由Bean类实现,是由部署描述符文件用EJB-QL声明并由EJB容器实现的。

5、 编写主键类,这个二者相同。

6、 编写Bean类,这是BMP和CMP最大的区别,在BMP中,我们需要明确的实现getter/setter方法,需要明确地实现ejbLoad()/ejbStore()方法和各种查找方法,及连接数据库的方法;而在我们的CMP中,这些方法我们只需要简单的声明一下,实现一个空的方法体就可以了,查找方法不用声明即可。同时,我们需要把getter/setter方法声明为abstract类型的,它由EJB容器实现,我们可以在Bean方法中调用它。(具体见后面示例的程序)

7、 编写ejb-jar.xml文件,这是EJB2.0规范标准定义的,由它定义我们的实体Bean的各种信息。这一点BMP和CMP是相同的,但是,在CMP的ejb-jar.xml文件中,除了定义Bean的各种属性如name,Remote,Home接口等信息外,还需定义实体Bean中getter/setter对应方法对应的声明字段信息,EJB容器根据这些声明的字段来维护实体Bean和数据库表字段之间的对应关系;同时,在CMP的ejb.jar.xml文件中,我们还需用EJB-QL语言描述我们在Home接口中定义的查找方法。也就是说,CMP的描述符文件ejb-jar.xml比BMP的ejb-jar.xmll多了两部分:一是声明由EJB容器维护的字段;二是用EJB-QL方法声明Home接口中定义的查找方法。这里说明一下,EJB-QL方法和SQL语法类似,它包括基本的Select ,From,Where等子句,具体可以查看EJB-QL参考。

8、 编写jboss-service.xml文件,这个文件声明实体Bean的Jndi信息,通过它的内容,我们可以在调用EJB的程序中通过lookup(“jndi-name”)查找到该Bean并调用它。

9、 编写jbosscmp-jdbc.xml,这是一个CMP特有的文件,它的内容主要是声明两个大方面的内容:一、声明我们的CMP实体Bean和数据库表之间的对应的关系,即声明我们的CMP通过哪个数据库连接池连接到数据库并和哪个数据库表对应。二、声明我们的CMP中的字段和数据库表中的哪个字段对应,这些字段数据类型之间的对应关系是什么。

这些步骤是我们在JBOSS中编写和布署CMP实体Bean的必需的方法,在其它开发平台和不同的容器下,也基本相同,我们下面将通过自己编写所有的文件来实现部署CMP,以使读者掌握各个文件和字段的作用,了解了这些后,相信在其它自动化的环境中编写和部署EJB这是很容易的事。




三、 范例CMP实体Bean的编写与部署文件的编写




这里,我们仍采用Mastering EJB一书中的示例来给大家讲解。这里对该书中的例子做了少许改动。

1、 第一步,我们定义该实体Bean对应的数据库表。我们这里采用mySQL数据库做为后库数据库支持,其它的数据库也是一样的,我们在mySQL安装后的一个叫test的数据库中,用如下的SQL语句来创建我们的数据库表:



USE test;

DROP TABLE IF EXISTS `productbean`;

CREATE TABLE `productbean` (

`productID` varchar(30) ,

`name` varchar(60) ,

`description` varchar(120) ,

`basePrice` double

) ;



此数据表对应于我们将要编写的CMP实体Bean即ProductBean。

2、 设置数据库连接池,详细说明请见本系列教程之二,在这里,我们就是在JBOSS的服务器发布目录


C:/JBOSS/server/all/deploy下新建一个mysql-ds.xml文件,其内容如下:



<?xml version=”1.0″ encoding=”gb2312″?>

<datasources>

<local-tx-datasource>

<jndi-name>MySql</jndi-name>

<connection-url>jdbc:mysql://10.0.0.18:3306/test</connection-url>

<driver-class>org.gjt.mm.mysql.Driver</driver-class>

<user-name>root</user-name>

<password></password>

</local-tx-datasource>

</datasources>



以上内容在JBOSS配置了一个mysql数据库连接池,mySQL数据库在10.0.0.18这台服务器上,连接端口为默认的3306端口,并定义连接到的数据库为Test这个库,同时我们指定在EJB中可以通过jndi名为MySql



版权声明:本文为jupiter97原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。