Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR

Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR(1)

这个系列文章我是根据 Rick Hightower 发表在 IBM 网站的文章 EJB - CMP/CMR 介绍》 改编而成的,这是一个系列,共有4篇文章。这篇文章综合了那4篇文章,看这篇文章前一定要参考一下,这样理解起来很方便,不过我做了部分修改,原理基本还是不变的。关于 CMP 方面的知识我不说了,我这里只是介绍如何使用 Lomboz 和 JBoss-IDE 在Eclipse 中开发 CMP。
这篇文章主要讲述如何开发一对一的双向关系,这里设计了一个UserInfoBean,和上篇文章《 Eclipse快速上手EJB -- 2. 设计一个实体Bean》中的UserBean建立关系,也是由它继续延伸而来。所以,必须要有上篇文章的基础才行。
关于环境配置、使用技巧还是要参考我以前的文章,这里尽量省略。
完整的源代码已经在最后附上。
一、设计实体Bean :UserInfoBean
1. 建立主体部分:
在 CMP_Sample 项目中,右击“src” ->新建 ->Lomboz EJB Creation Wizard :
·包(K) :javamxj.ejb.cmp
·名称(M): UserInfo
·EJB Type:选择ContainerManaged EntityEJB
点击下一步。
● Schema Name: UserInfoSchema
Table Name: UserInfoTable
增加一个 email 栏:
·Field: email
· Field Type: java.lang.String
· Database Column: 电子邮件
· SQL Type: varchar
并且使它成为主键
同样,再增加一个name 栏:
·Field: name
· Field Type: java.lang.String
· Database Column: 姓名
· SQL Type: varchar
同样,再增加一个dept 栏:
·Field: dept
· Field Type: java.lang.String
· Database Column: 组别
· SQL Type: varchar
同样,再增加一个workPhone 栏:
·Field: workPhone
· Field Type: java.lang.String
· Database Column: 工作电话
· SQL Type: varchar
同样,再增加一个age 栏:
·Field: age
· Field Type: java.lang.Integer
· Database Column: 年龄
· SQL Type: Integer
同样,再增加一个salary 栏:
·Field: salary
· Field Type: java.lang.Integer
· Database Column: 薪水
· SQL Type: Integer
同样,再增加一个age 栏:
·Field: age
· Field Type: java.lang.Integer
· Database Column: 年龄
· SQL Type: Integer
同样,再增加一个salary 栏:
·Field: salary
· Field Type: java.lang.Integer
· Database Column: 薪水
· SQL Type: Integer
效果如下,最后点击完成。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第1张图片
注意:如上篇文章一样,将生成代码中的 sql-type="varchar" 改写成 sql-type="varchar(xy)" ,xy是一个合适的VARCHAR 的位数。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第2张图片
2. 完成 ejbCreate 和 ejbPostCreate 方法:
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第3张图片
3. 在类标记中加入以下标记。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第4张图片
4. ejb.select 方法
· 右击 UserInfoBean ->J2EE ->Add Select Method (JBoss-IDE: 如果不清楚如何调出的,看上篇文章)
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第5张图片
·由于ejb.select 方法需要通过 Home 接口才能间接使用,所以:
右击 UserInfoBean ->J2EE ->Add Home Method
·由于ejb.select 方法需要通过 Home 接口才能间接使用,所以:
右击 UserInfoBean ->J2EE ->Add Home Method
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第6张图片
·如图,点击“完成”后生成的代码,需要手动添加一条返回语句。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第7张图片
5. 将 UserInfoBean 加入到 cmpEJB 模块中,然后 lomboz -> Generate EJB Classes
如下图,会生成6个文件,其中 UserInfoValue.java 是 “ @ejb.value-object”标记生成的值对象。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第8张图片
6. 添加一个抽象方法来调用值对象。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第9张图片
7. 重点建立 UserInfoBean 与 UserBean 的一对一的双向关系:
·右击 UserInfoBean ->J2EE ->Add CMRRelationship :
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第10张图片
·点击"完成"后,生成如下代码(红框中的语句需要手工添加):
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第11张图片
·切换到 UserBean.java
右击 UserBean ->J2EE ->Add CMRRelationship :
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第12张图片
·点击"完成"后,生成如下代码(红框中的语句需要手工添加):
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第13张图片
Ok,再次 Generate EJB Classes ,如果一切正常,再进行下一步。
(你可以看看在 ejb-jar.xml 和 jbosscmp-jdbc.xml 文件中生成的代码,加深理解)。


二、在UserManagementBean中添加业务方法


1. 增加一个 UserInfoLocalHome 的变量 userHome,并将它放入 ejbCreate 和 ejbPassivate 方法中。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第14张图片
2. 依次增加以下几个业务方法。
关于如何添加,如果要自己输入,可以利用 JBoss-IDE 带的 AddBusiness Method(看上篇文章);
或者简单的复制一下我完成好的代码。
这几个方法都很简单,也就不细说了,很容易读懂。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第15张图片
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第16张图片
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第17张图片
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第18张图片
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第19张图片
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第20张图片
好了,保存, Generate EJB Classes,启动MySql(启动后,先把上篇文章中建立在cmp_sample库中的 usertable表删除掉。), 启动JBoss服务器, Deploy Module 。
如果一切正常,则会在 cmp_sample 库中自动建立两个表:usertable 和 userinfotable
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第21张图片

三、创建客户端



1. 右击 src文件夹 ->新建 ->Lomboz EJB Test Client Wizard:
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第22张图片
2. 修改生成的 CMPClient2.java,调用UserManagementBean中的方法。
2.先在testBean()方法体外建立两个static方法,简化代码调用。

// 创建用户
public static void createUsers(UserManagement userMgmt)
throws RemoteException, CreateException {
System.out.println( "向UserInfo表中添加数据");
userMgmt.addUser( "[email protected]", "密码1", "王一",
"Engineering", "111-1212", 22, 2000);
userMgmt.addUser( "[email protected]", "密码2", "王二",
"Marketing", "222-1213",40, 4000);
userMgmt.addUser( "[email protected]", "密码3", "张三",
"IT", "1688888", 32, 2800);
userMgmt.addUser( "[email protected]", "密码4", "李四",
"Sales", "1288888", 28, 2700);
userMgmt.addUser( "[email protected]", "密码5", "朱王五",
"Sales", "1588888", 38, 4500);
userMgmt.addUser( "[email protected]", "分享Java快乐", "MXJ",
"IT", "1788888", 26, 2900);
}

// 输出ArrayList
private static void printList(ArrayList list) {
Iterator i = list.iterator();
while (i.hasNext()) {
Object details = ( Object) i.next();
System.out.println(details.toString());
}
System.out.println( "");
}

3.然后,将testBean()方法体内的 myBean 改成 userMgmt,再向表中添加数据及显示数据。如下,斜体的即是改动部分。
public void testBean() {

try {
javamxj.ejb.cmp.UserManagement userMgmt = getHome().create();

createUsers(userMgmt);

System.out.println("显示所有用户");

printList(userMgmt.getUsers());
运行程序,则控制台输出如下:
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第23张图片
4.将“createUsers(userMgmt);”语句注释掉,调用密码验证及改变用户姓名的方法。
//createUsers(userMgmt);
System.out.println( "显示所有用户");
printList(userMgmt.getUsers());


boolean login = false;
login = userMgmt.verifyPassword("[email protected]", "分享Java快乐");
System.out.println("密码验证: " + login);

System.out.println("改变用户[email protected]的名字");
userMgmt.changeName("[email protected]","Hello");
运行程序,则会发现 javamxj 的姓名已被更改为 Hello:
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第24张图片
5. 继续调用按年龄查询用户的方法:
System.out.println("采用 ejb.finder 输出大于30的用户");
printList(userMgmt.getUserByAge1(30));

System.out.println("采用 ejb.select 输出年龄大于30的用户");
printList(userMgmt.getUserByAge2(30));
输出:
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第25张图片
6.继续调用通过ValueObject输出用户的方法:
System.out.println("通过 ValueObject 输出用户信息:");
UserInfoValue[] users = userMgmt.getUsersInfo();
for (int index = 0; index < users.length; index++) {
UserInfoValue user = users[index];
System.out.println("用户 " + user.getEmail() + " 的年龄:"+ user.getAge());
}
输出:
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第26张图片
7. 继续调用通过姓名查询用户的方法:
System .out.println("输出姓王的用户");
printList(userMgmt.getUsersByName("王%"));
System.out.println("输出姓名中含有王字的用户");
printList(userMgmt.getUsersByName("%王%"));
输出:
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第27张图片
8. 删除一个用户,由于已经设置了级联删除的标记,所以虽然调用的方法是UserBean中的方法,但仍然会同时删除UserInfoBean中相关的数据。
// 删除一个用户
userMgmt.removeUser([email protected]);
查看数据表,会发现已经同时删除了usertable和userinfotable中关于的“ [email protected]”数据。
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第28张图片
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR_第29张图片
好了,这个算是讲完了。欲知后事如何,且听下回分解。
完整的源码

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)"
  font-weight: bold; color: 
  
分享到:
评论
happmaoo
  • 浏览: 1291459 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

你可能感兴趣的:(eclipse,sql,bean,jboss,ejb)