这个系列文章我是根据 Rick Hightower 发表在 IBM 网站的文章
《
EJB - CMP/CMR 介绍》
改编而成的,这是一个系列,共有4篇文章。这篇文章综合了那4篇文章,看这篇文章前一定要参考一下,这样理解起来很方便,不过我做了部分修改,原理基本还是不变的。关于 CMP 方面的知识我不说了,我这里只是介绍如何使用 Lomboz 和 JBoss-IDE 在Eclipse 中开发 CMP。
这篇文章主要讲述如何开发多对多的单向联系,这里设计了一个RoleBean,和UserBean建立联系,由UserBean控制RoleBean。重点放在如何使用XDoclet建立多对多的单向联系,客户端的调用比较简单。
这篇文章是由《
Eclipse快速上手EJB -- 2. 设计一个实体Bean
》、《
Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR(1)
》延伸而来。所以,必须要有这两篇文章的基础才行
关于环境配置、使用技巧还是要参考我以前的文章,这里尽量省略。
一、设计实体Bean :RoleBean
1. 建立主体部分:
●
在 CMP_Sample 项目中,右击“src” ->新建 ->Lomboz EJB Creation Wizard :
·
包(K) :javamxj.ejb.cmp
·
名称(M): Role
·
EJB Type:选择ContainerManaged EntityEJB
点击下一步。
● Schema Name:
RoleSchema
Table Name: RoleTable
●
增加一个
name
栏:
并且使它成为主键
。
·
Field: name
·
Field Type: java.lang.String
·
Database Column: 权限名称
·
SQL Type: varchar
●
同样,再增加一个
description
栏:
·
Field: description
·
Field Type: java.lang.String
·
Database Column: 权限描述
·
SQL Type: varchar
效果如下,最后点击完成。
注意
:如上篇文章一样,将生成代码中的 sql-type="varchar" 改写成 sql-type="varchar(xy)" ,xy是一个合适的VARCHAR 的位数。
2.
完成 ejbCreate 和 ejbPostCreate 方法:
3. 在类标记中加入以下标记:
●
下面给出了RoleBean.java的完整的源代码:
RoleBean.java
/*
* 创建日期 2005-1-25
*
* 作者:javamxj(分享java快乐)
*/
package
javamxj
.
ejb
.
cmp
;
/**
*
*
<!
-
-
begin
-
user
-
doc
-
-
> You can insert your documentation for '
<em>
<b>
RoleBean
</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>Role<
/
j2ee
:
display
-
name>
<j2ee
:
ejb
-
name>Role<
/
j2ee
:
ejb
-
name>
<j2ee
:
ejb
-
class>javamxj
.
ejb
.
cmp
.
RoleBean<
/
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>RoleSchema<
/
j2ee
:
abstract
-
schema
-
name>
<j2ee
:
primkey
-
field>name<
/
j2ee
:
primkey
-
field>
<
/
lomboz
:
entityEjb>
<lomboz
:
fieldMappings>
<lomboz
:
fieldName>name<
/
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>description<
/
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>RoleTable<
/
lomboz
:
tableName>
<lomboz
:
dataSourceName><
/
lomboz
:
dataSourceName>
<
/
lomboz
:
entity>
<
/
lomboz
:
EJB>
<!
-
-
end
-
lomboz
-
definition
-
-
>
*
*
<!
-
-
begin
-
xdoclet
-
definition
-
-
>
*
@
ejb
.
bean name="Role"
*
jndi
-
name="Role"
*
type="CMP"
*
primkey
-
field="name"
*
schema="RoleSchema"
*
cmp
-
version="
2.
x"
*
view
-
type = "local"
*
data
-
source=""
*
*
@
ejb
.
persistence
*
table
-
name="RoleTable"
*
*
@
jboss
.
persistence
*
create
-
table = "true"
*
remove
-
table = "false"
*
*
@
ejb
.
finder
*
query="SELECT OBJECT(a) FROM RoleSchema as a"
*
signature="java
.
util
.
Collection findAll()"
*
*
@
ejb
.
pk class="java
.
lang
.
String"
*
<!
-
-
end
-
xdoclet
-
definition
-
-
>
*
@
generated
*
*/
public
abstract
class
RoleBean
implements
javax.ejb.EntityBean {
/**
*
@
ejb
.
create
-
method
*/
public
java.lang.
String
ejbCreate(
String
name,
String
description)
throws
javax.ejb.CreateException {
// EJB 2.0 spec says return null for CMP ejbCreate methods.
setName(name);
setDescription(description);
return
null
;
}
/**
*
The container invokes this method immediately after it calls ejbCreate.
*/
public
void
ejbPostCreate(
String
name,
String
description)
throws
javax.ejb.CreateException {
}
/**
*
CMP Field name
*
@return
the name
*
@
ejb
.
persistent
-
field
*
@
ejb
.
persistence
*
column
-
name="权限名称"
*
jdbc
-
type="VARCHAR"
*
sql
-
type="varchar(
12
)"
*
read
-
only="false"
*
@
ejb
.
pk
-
field
*
*
@
ejb
.
interface
-
method
*/
public
abstract
java.lang.
String
getName();
/**
*
@param
java
.
lang
.
String the new name value
*
@
ejb
.
interface
-
method
*/
public
abstract
void
setName(java.lang.
String
name);
/**
*
CMP Field description
*
@return
the description
*
@
ejb
.
persistent
-
field
*
@
ejb
.
persistence
*
column
-
name="权限描述"
*
jdbc
-
type="VARCHAR"
*
sql
-
type="varchar(
30
)"
*
read
-
only="false"
*
*
*
@
ejb
.
interface
-
method
*/
public
abstract
java.lang.
String
getDescription();
/**
*
@param
java
.
lang
.
String the new description value
*
@
ejb
.
interface
-
method
*/
public
abstract
void
setDescription(java.lang.
String
description);
}
好了,保存,将 RoleBean 加入到 cmpEJB 模块中,然后 lomboz ->
Generate EJB Classes
。
4. 重点:建立 UserBean对 RoleBean 的多对多的单向联系:
·
由于这次设计的是UserBean对RoleBean的单向联系,所以只需要在UserBean中添加方法标记即可。
切换到
UserBean.java
,右击 UserBean ->J2EE ->Add
CMR
Relationship :
·
生成的标记如下,还需要手工添加一些@JBoss标记:
·
保存,
Generate EJB Classes
Eclipse快速上手EJB -- 4. 多对多的单向关系的CMR(2)
接上篇: Eclipse快速上手EJB -- 4. 多对多的单向关系的CMR(1)
二、在UserManagementBean中添加业务方法
1. 增加一个 UserInfoLocalHome 的变量 userHome,并将它放入 ejbCreate 和 ejbPassivate 方法中。
2. 依次增加以下几个业务方法。
|
UserManagementBean中有关 RoleBean 的部分(很简单) |
//**********************************************************************
// 多对多的单向关系
//**********************************************************************
/**
*
创建权限
*
Business method
*
@throws
CreateException
*
@
ejb
.
interface
-
method view
-
type = "remote"
*/
public
void
createRole(
String
roleName,
String
description)
throws
CreateException {
roleHome.create(roleName, description);
}
/**
*
显示所有权限
*
@throws
FinderException
*
@
ejb
.
interface
-
method view
-
type="remote"
*/
public
ArrayList getRoles()
throws
FinderException {
ArrayList roleList =
new
ArrayList(30);
Iterator iter = roleHome.findAll().iterator();
while
(iter.hasNext()) {
RoleLocal role = (RoleLocal) iter.next();
roleList.add(role.getName());
}
return
roleList;
}
/**
*
删除权限
*
@throws
RemoveException
*
@throws
EJBException
*
@
ejb
.
interface
-
method view
-
type="remote"
*/
public
void
removeRole(
String
name)
throws
EJBException, RemoveException {
roleHome.remove(name);
}
/**
*
给用户增加权限
*
@throws
FinderException
*
@
ejb
.
interface
-
method view
-
type="remote"
*/
public
void
addRole(
String
email,
String
roleName)
throws
FinderException {
UserLocal user = userHome.findByPrimaryKey(email);
Collection
roles = user.getRoles();
RoleLocal role = roleHome.findByPrimaryKey(roleName);
roles.add(role);
}
/**
*
得到某个用户拥有的权限
*
@throws
FinderException
*
@
ejb
.
interface
-
method view
-
type="remote"
*/
public
ArrayList getUserRole(
String
email)
throws
FinderException{
ArrayList roleList =
new
ArrayList(30);
UserLocal user = userHome.findByPrimaryKey(email);
Iterator iter = user.getRoles().iterator();
while
(iter.hasNext()) {
RoleLocal role = (RoleLocal) iter.next();
roleList.add(role.getName());
}
return
roleList;
}
|
3. 好了,保存,
Generate EJB Classes,
启动MySql,
启动JBoss服务器,
Deploy Module
。
如果一切正常,则会在 cmp_sample 库中自动建立两个表:roletable 和 userrole 。
role_fk 和 email_fk 是在 UserBean 中的 getRoles 的方法标记中定义的。
三、创建客户端
1. 右击 src文件夹 ->新建 ->Lomboz EJB Test Client Wizard:
创建一个 CMPClient3.java 文件 (步骤同前两篇文章一样)。
2. 修改生成的 CMPClient3.java,调用UserManagementBean中的方法。
这里给出了完整的源代码:
CMPClient3.java
/*
* 创建日期 2005-1-25
*
* 作者:javamxj(分享java快乐)
*/
package
javamxj
.
ejb
.
client
;
import
java
.
rmi
.
RemoteException
;
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Hashtable
;
import
java
.
util
.
Iterator
;
import
javamxj
.
ejb
.
cmp
.
UserManagement
;
import
javax
.
ejb
.
CreateException
;
import
javax
.
ejb
.
FinderException
;
import
javax
.
naming
.
InitialContext
;
import
javax
.
naming
.
NamingException
;
/**
*
@author
pc
*
*
TODO 要更改此生成的类型注释的模板,请转至
*
窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public
class
CMPClient3 {
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 userMgmt = getHome().create();
createUsers(userMgmt);
System
.out.println(
"显示所有权限"
);
printList(userMgmt.getRoles());
System
.out.println(
"给用户wangyi@aaa.com增加权限 "
);
userMgmt.addRole(
"wangyi@aaa.com"
,
color:
发表评论
- 浏览: 1291458 次
-
性别:
- 来自: 杭州
-
最新评论
-
netkongjian
: 不错的软件知识,感谢分享!
软件加密方式 -
norce
: 效果不错~
JS实现图片幻灯片效果 -
zxbear
: 链接已失效
《jQuery基础教程:第2版》PDF -
架构师
: 在技术领域方面Java还是世界上最好的,而且有很多第三方控件的 ...
专访:Ruby能否成为第二个Java -
freddie
: 如何拖动表格边框调整行高和列宽?
可编辑的表格(JavaScript)


评论