Eclipse快速上手EJB -- 2. 设计一个实体Bean
2005-03-11 22:54
465 查看
这个系列文章我是根据 Rick Hightower 发表在 IBM 网站的文章 《EJB - CMP/CMR 介绍》 改编而成的,看这篇文章前一定要参考一下,这样理解起来很方便。关于 CMP 方面的知识我不说了,我这里只是介绍如何使用 Lomboz 和 JBoss-IDE 在Eclipse 中开发 CMP。 在看这篇文章之前,需要对开发环境的配置了解清楚,这一点我在前篇文章《Eclipse快速上手EJB -- 1. Lomboz + JBoss-IDE 配置1+2 》 中已经详细介绍了,这篇文章就是以它为前提进行的。 一、JBoss相关配置 在 《快速上手 MySQL --图形化操作详解 》 中谈到的mysql-connector-java-3.0.16-ga.zip现在有了用场,将其解压,会发现其中有一个文件 mysql-connector-java-3.0.16-ga-bin.jar,它就是 MySQL的驱动程序。把它复制到F:/java/jboss/server/default/lib 目录下,这里 F:/java/jboss 是JBoss的安装目录。 从jboss/docs/examples/jca/目录下复制mysql-ds.xml文件到jboss/server/default/deploy目录,需要做一点修改。[i][i][i][i]mysql-ds.xml
[/i][/i][/i][/i]<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: mysql-ds.xml,v 1.3 2004/09/15 14:37:40 loubyansky Exp $ -->
<!-- Datasource config for MySQL using 3.0.9 available from: http://www.mysql.com/downloads/api-jdbc-stable.html -->
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/cmp_sample?useUnicode=true&characterEncoding=GBK</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>javamxj</password>
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
这是修改后的文件,很简单,注意用户名和密码替换成自己的,还有就是使用的数据库是“cmp_sample”,如果没有这个数据库,那么先在MySQL中建立它。使用GBK进行编码,解决了中文问题(结合《快速上手 MySQL --图形化操作详解 》中 MySQL 的配置)。 二、建立项目 ● 新建一个 Lomboz J2EE Project: ·项目名:CMP_Sample ·EJB Modules:cmpEJB·Targeted Server: JBoss 4.0.0 ● 继续在 CMP_Sample 项目中,右击“src” ->新建 ->Lomboz EJB Creation Wizard :· 包(K) :javamxj.ejb.cmp· 名称(M): User· EJB Type: 选择 Container Managed Entity EJB 点击下一步。
● 同样,再增加一个密码栏:· Field: password, · Field Type: java.lang.String, · Database Column: 密码, · SQL Type: varchar 这个不要使它成为主键。 最后点击完成。 三、验证配置 · 现在修改生成的 UserBean.java 文件,先添加自动创建表的语句
· 注意:如果使用自动创建表的语句,这里有个bug:
● 好了,现在来试验一下各种配置有没有问题: · 先将 UserBean.java 添加到 cmpEJB 模块中,然后 lomboz ->Generate EJB Classes 生成其它ejb类文件(建议看看生成的文件,弄清楚 XDoclet 的原理)。 · 运行 MySQl 服务,再通过 Lomboz 启动 JBoss 服务器。 · 然后通过 Deploy Module 部署 cmpEJB 模块,再打开MySql的客户端,会发现在 cmp_sample 数据库中已经自动生成了一个 usertable 的数据表,如图:
如果能顺利进行到这一步,那么各种配置都没问题,再开始下一阶段。 ● 完成 ejbCreate 和 ejbPostCreate 方法:
● 在上面的 @ejb.bean 中添加 view-type = "local"
保存,UserBean 暂时告一段落。 四、创建会话Bean ● 右击 javamxj.ejb.cmp包,还是选择Lomboz EJB Creation Wizard :· 包(K) :javamxj.ejb.cmp· 名称(M): UserManagement· EJB Type: 选择 Stateless然后,点击“完成”,这时会生成一个 UserManagementBean.java 的文件 ● 首先,增加一个 UserLocalHome 的变量 userHome, private UserLocalHome userHome = null; ● 然后右击 UserManagementBean ->J2EE ->Add Create Method(这是 JBossv-IDE 附带的):
● 下一步:
在生成的代码框中添加语句:userHome = UserUtil.getLocalHome(); ● 如下图:需要手工输入的语句已经标出来了:
● 添加业务方法: · 增加 addUser 方法,向上面操作一样,右击 UserManagementBean ->J2EE ->Add Business Method:
在生成的代码框中添加语句:UserLocal user = userHome.create(email, password); · 增加 removeUser 方法
在生成的代码框中添加语句:userHome.remove(email); · 增加 verifyPassword 方法
在生成的代码框中添加语句:UserLocal user = userHome.findByPrimaryKey(email);
return user.getPassword().equals(password); ● 为了将 UserBean 与 UserManagementBean 联系起来,在上面注释中添加: * view-type = "remote" * @ejb.ejb-ref ejb-name = "User"
* view-type = "local"
* ref-name = "ejb/UserLocal"
*
* @jboss.ejb-local-ref ref-name = "UserLocal"
* jndi-name = "UserLocal"如图:
好了,UserManagementBean 暂时完成了。 ● 将 UserManagementBean 加入到 cmpEJB 模块中, · 然后 lomboz ->Generate EJB Classes · 运行 MySQl 服务,再通过 Lomboz 启动 JBoss 服务器。 · 然后通过 Deploy Module 部署 cmpEJB 模块 如果一切正常,那么开始创建客户端。 五、创建客户端 · 右击 src 文件夹 ->新建 ->Lomboz EJB Test Client Wizard:
· 修改生成的 CMPClient1.java
· 运行客户端程序,则客户端控制台会输出:Login =true · 同时,用 MySQL 客户端软件查看 cmp_sample 表,则如下,显示3条数据。
六、完整的源码 [i][i][i][i][i]UserBean.java
[/i][/i][/i][/i][/i]
[/i]
[/i]
[/i][/i][/i][/i]<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: mysql-ds.xml,v 1.3 2004/09/15 14:37:40 loubyansky Exp $ -->
<!-- Datasource config for MySQL using 3.0.9 available from: http://www.mysql.com/downloads/api-jdbc-stable.html -->
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/cmp_sample?useUnicode=true&characterEncoding=GBK</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>javamxj</password>
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
这是修改后的文件,很简单,注意用户名和密码替换成自己的,还有就是使用的数据库是“cmp_sample”,如果没有这个数据库,那么先在MySQL中建立它。使用GBK进行编码,解决了中文问题(结合《快速上手 MySQL --图形化操作详解 》中 MySQL 的配置)。 二、建立项目 ● 新建一个 Lomboz J2EE Project: ·项目名:CMP_Sample ·EJB Modules:cmpEJB·Targeted Server: JBoss 4.0.0 ● 继续在 CMP_Sample 项目中,右击“src” ->新建 ->Lomboz EJB Creation Wizard :· 包(K) :javamxj.ejb.cmp· 名称(M): User· EJB Type: 选择 Container Managed Entity EJB 点击下一步。
● 同样,再增加一个密码栏:· Field: password, · Field Type: java.lang.String, · Database Column: 密码, · SQL Type: varchar 这个不要使它成为主键。 最后点击完成。 三、验证配置 · 现在修改生成的 UserBean.java 文件,先添加自动创建表的语句
· 注意:如果使用自动创建表的语句,这里有个bug:
● 好了,现在来试验一下各种配置有没有问题: · 先将 UserBean.java 添加到 cmpEJB 模块中,然后 lomboz ->Generate EJB Classes 生成其它ejb类文件(建议看看生成的文件,弄清楚 XDoclet 的原理)。 · 运行 MySQl 服务,再通过 Lomboz 启动 JBoss 服务器。 · 然后通过 Deploy Module 部署 cmpEJB 模块,再打开MySql的客户端,会发现在 cmp_sample 数据库中已经自动生成了一个 usertable 的数据表,如图:
如果能顺利进行到这一步,那么各种配置都没问题,再开始下一阶段。 ● 完成 ejbCreate 和 ejbPostCreate 方法:
● 在上面的 @ejb.bean 中添加 view-type = "local"
保存,UserBean 暂时告一段落。 四、创建会话Bean ● 右击 javamxj.ejb.cmp包,还是选择Lomboz EJB Creation Wizard :· 包(K) :javamxj.ejb.cmp· 名称(M): UserManagement· EJB Type: 选择 Stateless然后,点击“完成”,这时会生成一个 UserManagementBean.java 的文件 ● 首先,增加一个 UserLocalHome 的变量 userHome, private UserLocalHome userHome = null; ● 然后右击 UserManagementBean ->J2EE ->Add Create Method(这是 JBossv-IDE 附带的):
● 下一步:
在生成的代码框中添加语句:userHome = UserUtil.getLocalHome(); ● 如下图:需要手工输入的语句已经标出来了:
● 添加业务方法: · 增加 addUser 方法,向上面操作一样,右击 UserManagementBean ->J2EE ->Add Business Method:
在生成的代码框中添加语句:UserLocal user = userHome.create(email, password); · 增加 removeUser 方法
在生成的代码框中添加语句:userHome.remove(email); · 增加 verifyPassword 方法
在生成的代码框中添加语句:UserLocal user = userHome.findByPrimaryKey(email);
return user.getPassword().equals(password); ● 为了将 UserBean 与 UserManagementBean 联系起来,在上面注释中添加: * view-type = "remote" * @ejb.ejb-ref ejb-name = "User"
* view-type = "local"
* ref-name = "ejb/UserLocal"
*
* @jboss.ejb-local-ref ref-name = "UserLocal"
* jndi-name = "UserLocal"如图:
好了,UserManagementBean 暂时完成了。 ● 将 UserManagementBean 加入到 cmpEJB 模块中, · 然后 lomboz ->Generate EJB Classes · 运行 MySQl 服务,再通过 Lomboz 启动 JBoss 服务器。 · 然后通过 Deploy Module 部署 cmpEJB 模块 如果一切正常,那么开始创建客户端。 五、创建客户端 · 右击 src 文件夹 ->新建 ->Lomboz EJB Test Client Wizard:
· 修改生成的 CMPClient1.java
· 运行客户端程序,则客户端控制台会输出:Login =true · 同时,用 MySQL 客户端软件查看 cmp_sample 表,则如下,显示3条数据。
六、完整的源码 [i][i][i][i][i]UserBean.java
[/i][/i][/i][/i][/i]
/* * 创建日期 2005-1-14 * * 作者:javamxj(分享java快乐) */ package javamxj.ejb.cmp; /** * * <!-- begin-user-doc --> You can insert your documentation for '<em><b>UserBean</b></em>'. <!-- end-user-doc --> * <!-- begin-lomboz-definition --> <?xml version="1.0" encoding="UTF-8"?> <lomboz:EJB xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" xmlns:lomboz="http://lomboz.objectlearn.com/xml/lomboz"> <lomboz:entity> <lomboz:entityEjb> <j2ee:display-name>User</j2ee:display-name> <j2ee:ejb-name>User</j2ee:ejb-name> <j2ee:ejb-class>javamxj.ejb.cmp.UserBean</j2ee:ejb-class> <j2ee:persistence-type>Container</j2ee:persistence-type> <j2ee:prim-key-class>java.lang.String</j2ee:prim-key-class> <j2ee:cmp-version>2.x</j2ee:cmp-version> <j2ee:abstract-schema-name>userSchema</j2ee:abstract-schema-name> <j2ee:primkey-field>eamil</j2ee:primkey-field> </lomboz:entityEjb> <lomboz:fieldMappings> <lomboz:fieldName>email</lomboz:fieldName> <lomboz:fieldType>java.lang.String</lomboz:fieldType> <lomboz:columnName>电子邮件</lomboz:columnName> <lomboz:jdbcType>VARCHAR</lomboz:jdbcType> <lomboz:sqlType>varchar</lomboz:sqlType> <lomboz:readOnly>false</lomboz:readOnly> <lomboz:primaryKey>true</lomboz:primaryKey> </lomboz:fieldMappings> <lomboz:fieldMappings> <lomboz:fieldName>password</lomboz:fieldName> <lomboz:fieldType>java.lang.String</lomboz:fieldType> <lomboz:columnName>密码</lomboz:columnName> <lomboz:jdbcType>VARCHAR</lomboz:jdbcType> <lomboz:sqlType>varchar</lomboz:sqlType> <lomboz:readOnly>false</lomboz:readOnly> <lomboz:primaryKey>false</lomboz:primaryKey> </lomboz:fieldMappings> <lomboz:tableName>userTable</lomboz:tableName> <lomboz:dataSourceName></lomboz:dataSourceName> </lomboz:entity> </lomboz:EJB> <!-- end-lomboz-definition --> * * <!-- begin-xdoclet-definition --> * @ejb.bean name="User" * jndi-name="User" * type="CMP" * primkey-field="email" * schema="userSchema" * cmp-version="2.x" * view-type = "local" * data-source="" * * @ejb.persistence * table-name="userTable" * * @ejb.finder * query="SELECT OBJECT(a) FROM userSchema as a" * signature="java.util.Collection findAll()" * * @jboss.persistence create-table = "true" * remove-table = "false" * * @ejb.pk class="java.lang.String" * <!-- end-xdoclet-definition --> * @generated **/ public abstract class UserBean implements javax.ejb.EntityBean { /** * @ejb.create-method */ public java.lang.String ejbCreate(String email, String password) throws javax.ejb.CreateException { // EJB 2.0 spec says return null for CMP ejbCreate methods. setEmail(email); setPassword(password); return null; } /** * The container invokes this method immediately after it calls ejbCreate. */ public void ejbPostCreate(String email, String password) throws javax.ejb.CreateException { } /** * CMP Field email * @return the email * @ejb.persistent-field * @ejb.persistence * column-name="电子邮件" * jdbc-type="VARCHAR" * sql-type="varchar(64)" * read-only="false" * @ejb.pk-field * * @ejb.interface-method */ public abstract java.lang.String getEmail(); /** * @param java.lang.String the new email value * @ejb.interface-method */ public abstract void setEmail(java.lang.String email); /** * CMP Field password * @return the password * @ejb.persistent-field * @ejb.persistence * column-name="密码" * jdbc-type="VARCHAR" * sql-type="varchar(64)" * read-only="false" * * @ejb.interface-method */ public abstract java.lang.String getPassword(); /** * @param java.lang.String the new password value * @ejb.interface-method */ public abstract void setPassword(java.lang.String password); }[i]UserManagementBean.java
[/i]
/* * 创建日期 2005-1-14 * * 作者:javamxj(分享java快乐) */ package javamxj.ejb.cmp; /** * * <!-- begin-user-doc --> A generated session bean <!-- end-user-doc --> * <!-- lomboz.beginDefinition --> <?xml version="1.0" encoding="UTF-8"?> <lomboz:EJB xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" xmlns:lomboz="http://lomboz.objectlearn.com/xml/lomboz"> <lomboz:session> <lomboz:sessionEjb> <j2ee:display-name>UserManagement</j2ee:display-name> <j2ee:ejb-name>UserManagement</j2ee:ejb-name> <j2ee:ejb-class>javamxj.ejb.cmp.UserManagementBean</j2ee:ejb-class> <j2ee:session-type>Stateless</j2ee:session-type> <j2ee:transaction-type>Container</j2ee:transaction-type> </lomboz:sessionEjb> </lomboz:session> </lomboz:EJB> <!-- lomboz.endDefinition --> * * <!-- begin-xdoclet-definition --> * @ejb.bean name="UserManagement" * jndi-name="UserManagement" * type="Stateless" * transaction-type="Container" * view-type = "remote" * * @ejb.ejb-ref * ejb-name = "User" * view-type = "local" * ref-name = "ejb/UserLocal" * * @jboss.ejb-local-ref * ref-name = "UserLocal" * jndi-name = "UserLocal" * * <!-- end-xdoclet-definition --> * @generated */ public abstract class UserManagementBean implements javax.ejb.SessionBean { private UserLocalHome userHome = null; /** * Create method * @ejb.create-method view-type = "remote" */ public void ejbCreate() throws javax.ejb.CreateException, javax.naming.NamingException { userHome = UserUtil.getLocalHome(); } public void ejbPassivate() { userHome = null; } /** * Business method * @ejb.interface-method view-type = "remote" */ public void addUser(String email, String password) throws javax.ejb.CreateException { UserLocal user = userHome.create(email, password); } /** * Business method * @ejb.interface-method view-type = "remote" */ public void removeUser(String email) throws javax.ejb.RemoveException { userHome.remove(email); } /** * Business method * @ejb.interface-method view-type = "remote" */ public boolean verifyPassword(String email, String password) throws javax.ejb.FinderException { UserLocal user = userHome.findByPrimaryKey(email); return user.getPassword().equals(password); } }[i]CMPClient1.java
[/i]
/* * 创建日期 2005-1-14 * * 作者:javamxj(分享java快乐) */ package javamxj.ejb.client; import java.rmi.RemoteException; import java.util.Hashtable; import javax.ejb.CreateException; import javax.ejb.FinderException; import javax.ejb.RemoveException; import javax.naming.InitialContext; import javax.naming.NamingException; public class CMPClient1 { private javamxj.ejb.cmp.UserManagementHome getHome() throws NamingException { return (javamxj.ejb.cmp.UserManagementHome) getContext().lookup( javamxj.ejb.cmp.UserManagementHome.JNDI_NAME); } private InitialContext getContext() throws NamingException { Hashtable props = new Hashtable(); props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099"); // This establishes the security for authorization/authentication // props.put(InitialContext.SECURITY_PRINCIPAL,"username"); // props.put(InitialContext.SECURITY_CREDENTIALS,"password"); InitialContext initialContext = new InitialContext(props); return initialContext; } public void testBean() { try { javamxj.ejb.cmp.UserManagement myBean = getHome().create(); // 增加4个用户 myBean.addUser("rick@rickhightower.com", "mypassword"); myBean.addUser("nick@rickhightower.com", "oxford"); myBean.addUser("javamxj@yahoo.com.cn", "分享Java快乐"); myBean.addUser("aaa@bbb.com","ccc"); // 验证用户和密码是否相符 boolean login = false; login = myBean.verifyPassword("javamxj@yahoo.com.cn", "分享Java快乐"); System.out.println("Login =" + login); // 删除用户 myBean.removeUser("aaa@bbb.com"); //-------------------------------------- //This is the place you make your calls. //System.out.println(myBean.callYourMethod()); } catch (RemoteException e) { e.printStackTrace(); } catch (CreateException e) { e.printStackTrace(); } catch (NamingException e) { e.printStackTrace(); } catch (FinderException e) { e.printStackTrace(); } catch (RemoveException e) { e.printStackTrace(); } } public static void main(String[] args) { CMPClient1 test = new CMPClient1(); test.testBean(); } }后记: 这些代码需要保存好,后面会在此基础上进一步扩展,开发含有更复杂联系的程序。 下篇文章讲述如何设计一对一的双向联系。
相关文章推荐
- Eclipse快速上手EJB -- 2. 设计一个实体Bean
- Eclipse快速上手EJB -- 2. 设计一个实体Bean
- Eclipse快速上手EJB -- 2. 设计一个实体Bean
- Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR(1)
- Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR
- Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR
- Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR(1)
- Eclipse快速上手EJB -- 3. 一对一的双向关系的CMR(3)
- Eclipse快速上手EJB -- 4. 多对多的单向关系的CMR(2)
- Eclipse快速上手EJB -- 5. 一对多的双向关系的CMR(2)
- Eclipse快速上手EJB -- 1. Lomboz + JBoss-IDE 配置
- Eclipse快速上手EJB -- 4. 多对多的单向关系的CMR(1)
- Eclipse快速上手EJB -- 3. 一对一的双向关系的CMR(2)
- Eclipse快速上手EJB -- 1. Lomboz + JBoss-IDE 配置1
- Eclipse快速上手EJB -- 1. Lomboz + JBoss-IDE 配置2
- Eclipse快速上手EJB . Lomboz + JBoss-IDE 配置
- Eclipse快速上手EJB -- 1. Lomboz + JBoss-IDE 配置1
- Eclipse快速上手EJB -- 4. 多对多的单向关系的CMR(2)
- Eclipse快速上手EJB -- 3. 一对一的双向关系的CMR(3)
- Eclipse快速上手EJB -- 1. Lomboz + JBoss-IDE 配置1