Eclipse + jboss开发EJB详细步骤

来源:互联网 发布:设计数据库的软件dba 编辑:程序博客网 时间:2024/05/17 04:03

BMP和CMP同属EJB2.x规范中定义的实体Bean(Entity Bean),一个实体Bean是由多个类和接口组成,我们可以认为一个实体Bean代表数据库中的一个表(姑且这么认为),一个实体Bean的一个具体对象代表该表中的一条记录。也就是说,实体Bean是位于数据库和用户应用之间的数据中间件.这个数据中间件由EJB容器负责管理,具体来说也即:当实体Bean部署时,EJB容器通过ejbLoad()方法将数据表中的数据填充到实体Bean并产生实体Bean对象;当实体Bean对象要释放时,EJB容器就调用实体Bean的ejbStore()方法将实体Bean对象中的数据存入数据表中;通过以上两步可以保持数据库表与实体Bean数据中间件同步。

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

环境配置-工欲善其事必先利其器

1. Configuring Xdoclet for J2ee Applications in Eclipse

Xdoclet can be downloaded from

http://www.xdoclet.sourceforge.net/xdoclet/install.html

 

开始了

2. Create new project in Eclipse

 

 3. Create XDoclet Enterprise JavaBean

 

 

 

 Select the table:

S

 

 这个CMP BEAN已经生成好了。会生成相应的home接口,remote接口,local接口。大部分的代码自动生成不一一介绍。

下面是如何配置与部署:

1.ejb-jar.xml

放在META-INF目录下,如果要定义其他的find方法,就在这里定义query EJB-QL语句。像这样的:

<![CDATA[SELECT OBJECT(a) FROM ProductBean AS a WHERE a.basePrice<?1]]>

加入事务:

<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>Greet</ejb-name>
<method-intf>Remote</method-intf>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>

2.jboss-service.xml

同样也放在META-INF目录下。

<jboss>
   <enterprise-beans>
     <entity>
       <ejb-name>Greet</ejb-name> <!—ejb-jar.xml文件中指定的ejb-name-- >
       <jndi-name>Greet</jndi-name> <!-- -- >
     </entity>
<secure>true</secure>
   </enterprise-beans>
<reource-managers/>
</jboss>

3.jbosscmp-jdbc.xml

META-INF目录下。这是一个JBOSS中部署CMP实体Bean特有的描述符文件,这个文件描述了实体Bean和数据库表的对应关系,同时它也描述了实体Bean维护的声明字段和数据库表中字段的对应关系及数据类型的对应关系.

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 3.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd">
<jbosscmp-jdbc>
<defaults>
<!--数据源的jndi名字,它和deploy目录下的数据源配置文件mysql-ds.xml中的jndi-name对应,如果此项不指定,则默认采用DefaultDS-->
<datasource>java:/MySql</datasource><!--说明让EJB容器采用MySql连接池连接数据库-- >
<!—这一句指出Java中的数据类型和数据库数据类型之间的映射关系,这里指出映射关系采用一个叫mySQL的DataTypeMapping中指定的映射关系,这个mySQL的映射关系己由JBOSS定义好了,它存放在C:/JBOSS/server/all/conf/standardjbosscmp-jdbc.xml文件中 -- >
<datasource-mapping>mySQL</datasource-mapping>
<!—指出如果容器在连接数据库时,发现没有数据表,是否根据ejb-jar.xml中和下面定义的CMP域来创建一个数据库表-- >
<create-table>true</create-table>
<!—下面一句指出如果数据库中表己存在,是否删除它-- >
<remove-table>false</remove-table>
<pk-constraint>true</pk-constraint> <!—主键约束 -- >
<preferred-relation-mapping>foreign-key</preferred-relation-mapping>
</defaults>
<enterprise-beans>
<entity>
<!—实体Bean的jndi名字,必须和ejb-jar.xml中的ejb-name对应-->
<ejb-name>Greet</ejb-name>
   <!—和数据库中哪个表对应-- >
<table-name>Greet</table-name>
<! – 下面定义CMP Bean中由容器维护的域的定义及其数据类型的定义-- >
<!— 注意这些域的名称的写法要和 getter/setter 方法中一致 -- >
<cmp-field>
<field-name>name</field-name>
<column-name>name</column-name>
<jdbc-type>VARCHAR</jdbc-type>
<sql-type>VARCHAR(60)</sql-type>
</cmp-field>
<cmp-field>
<field-name>productID</field-name>
<column-name>productID</column-name>
<jdbc-type>VARCHAR</jdbc-type>
<sql-type>VARCHAR(30)</sql-type>
</cmp-field>
<cmp-field>
<field-name>description</field-name>
<column-name>description</column-name>
<jdbc-type>VARCHAR</jdbc-type>
<sql-type>VARCHAR(120)</sql-type>
</cmp-field>
<cmp-field>
<field-name>basePrice</field-name>
<column-name>basePrice</column-name>
<jdbc-type>DOUBLE</jdbc-type>
<sql-type>DOUBLE</sql-type>
</cmp-field>
</entity>
</enterprise-beans>
</jbosscmp-jdbc>

4.设置数据库连接池。

在JBOSS_HOME/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>

 最后将所有的classes 和部署描述符打包成EJB jar。放到jboss_home下的deploy目录下。当然数据库驱动的jar包也 要copy到对应的目录下。