分享
 
 
 

Eclipse快速上手EJB -- 2. 设计一个实体Bean

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

这个系列文章我是根据 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目录,需要做一点修改。

mysql-ds.xml

<?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&amp;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条数据。

六、完整的源码

UserBean.java

/*

* 创建日期 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);

}

UserManagementBean.java

/*

* 创建日期 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);

}

}

CMPClient1.java

/*

* 创建日期 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();

}

}

后记:

这些代码需要保存好,后面会在此基础上进一步扩展,开发含有更复杂联系的程序。

下篇文章讲述如何设计一对一的双向联系。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有