這個系列文章我是根據 Rick Hightower 發表在 IBM 網站的文章 《 EJB - CMP/CMR 介紹》 改編而成的,這是一個系列,共有4篇文章。這篇文章綜合了那4篇文章,看這篇文章前一定要參考一下,這樣理解起來很方便,不過我做了部分修改,原理基本還是不變的。關于 CMP 方面的知識我不說了,我這里只是介紹如何使用 Lomboz 和 JBoss-IDE 在Eclipse 中開發 CMP。
這篇文章主要講述如何開發一對多的雙向聯系,這里設計了一個GroupBean,和UserInfoBean建立聯系(注意,IBM 網站的文章是和UserBean建立聯系,這里我認為和UserInfoBean建立聯系更合適)。重點放在如何使用XDoclet建立一對多的雙向聯系,客戶端的調用比較簡單。
這篇文章是由《
Eclipse快速上手EJB -- 2. 設計一個實體Bean
》、《
Eclipse快速上手EJB -- 3. 設計一對一的雙向關系的CMR(1)
》《
Eclipse快速上手EJB -- 4. 多對多的單向關系的CMR(1)
》延伸而來。所以,必須要有這三篇文章的基礎才行。
關于環境配置、使用技巧還是要參考我以前的文章,這里盡量省略。
一、設計實體Bean :GroupBean
1. 建立主體部分:
●
在 CMP_Sample 項目中,右擊“src” ->新建 ->Lomboz EJB Creation Wizard :
·
包(K) :javamxj.ejb.cmp
·
名稱(M): Group
·
EJB Type:選擇ContainerManaged EntityEJB
點擊下一步。
● Schema Name:
GroupSchema
Table Name: GroupTable
●
增加一個
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. 在類標記中加入以下標記:
4. 增加一個Select method ,你可以使用JBoss-IDE得到,這里是代碼(后面有完整的源代碼):
//######################## Select method ##############################
/**
* Select method
* @ ejb . select
* query = "SELECT user . email FROM GroupSchema AS g , IN (g . users) AS user WHERE g . name = ? 1 "
*
*/
public abstract java.util. Collection ejbSelectUserIDs( String groupName)
throws javax.ejb.FinderException;
/**
* Select method
* @ ejb . select
* query = "SELECT user . email FROM GroupSchema AS g , IN (g . users) AS user WHERE g . name = ? 1 "
*
*/
public abstract java.util. Collection ejbSelectUserIDs( String groupName)
throws javax.ejb.FinderException;
/**
* Home method
* @throws FinderException
* @ ejb . home - method view - type = "local"
*/
public java.util.ArrayList ejbHomeGetUserIDs( String groupName)
throws javax.ejb.FinderException {
return (java.util.ArrayList) ejbSelectUserIDs(groupName);
}
5. 將 GroupBean 加入到 cmpEJB 模塊中,然后 lomboz ->Generate EJB Classes
6. 重點:建立 GroupBean 與 UserInfoBean的一對多的雙向聯系:
●
右擊 GroupBean ->J2EE ->AddCMRRelationship :
生成的代碼參考下面給出的完整的源代碼。
●
切換到
UserInfoBean.java
:
/**
* Getter for CMR Relationship
*
* @ ejb . interface - method view - type="local"
* @ ejb . relation name = "GroupsHaveUserInfos"
* role - name = "UserInfosInGroup"
* target - multiple = "yes"
* @ jboss . relation
* fk - column = "組別"
* related - pk - field = "name"
*/
public abstract javamxj.ejb.cmp.GroupLocal getGroup();
/**
* Setter for CMR Relationship
*
* @ ejb . interface - method view - type="local"
*/
public abstract void setGroup(javamxj.ejb.cmp.GroupLocal value);
* Getter for CMR Relationship
*
* @ ejb . interface - method view - type="local"
* @ ejb . relation name = "GroupsHaveUserInfos"
* role - name = "UserInfosInGroup"
* target - multiple = "yes"
* @ jboss . relation
* fk - column = "組別"
* related - pk - field = "name"
*/
public abstract javamxj.ejb.cmp.GroupLocal getGroup();
/**
* Setter for CMR Relationship
*
* @ ejb . interface - method view - type="local"
*/
public abstract void setGroup(javamxj.ejb.cmp.GroupLocal value);
Ok,再次
Generate EJB Classes
,如果一切正常,再進行下一步。
●
下面給出了GroupBean.java的完整的源代碼:
GroupBean.java
/*
* 創建日期 2005-1-26
*
* 作者:javamxj(分享java快樂)
*/
package
javamxj
.
ejb
.
cmp
;
/**
*
*
<!
-
-
begin
-
user
-
doc
-
-
> You can insert your documentation for '
<em>
<b>
GroupBean
</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>Group<
/
j2ee
:
display
-
name>
<j2ee
:
ejb
-
name>Group<
/
j2ee
:
ejb
-
name>
<j2ee
:
ejb
-
class>javamxj
.
ejb
.
cmp
.
GroupBean<
/
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>GroupSchema<
/
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>GroupTable<
/
lomboz
:
tableName>
<lomboz
:
dataSourceName><
/
lomboz
:
dataSourceName>
<
/
lomboz
:
entity>
<
/
lomboz
:
EJB>
<!
-
-
end
-
lomboz
-
definition
-
-
>
*
*
<!
-
-
begin
-
xdoclet
-
definition
-
-
>
*
@
ejb
.
bean name="Group"
*
jndi
-
name="Group"
*
type="CMP"
*
primkey
-
field="name"
*
schema="GroupSchema"
*
cmp
-
version="
2.
x"
*
view
-
type = "local"
*
data
-
source=""
*
*
@
ejb
.
persistence
*
table
-
name="GroupTable"
*
*
*
*
@
ejb
.
finder
*
query="SELECT OBJECT(a) FROM GroupSchema as a"
*
signature="java
.
util
.
Collection findAll()"
*
*
@
ejb
.
pk class="java
.
lang
.
String"
*
<!
-
-
end
-
xdoclet
-
definition
-
-
>
*
@
generated
*
*/
public
abstract
class
GroupBean
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(
24
)"
*
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(
24
)"
*
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);
//######################## Select method ##############################
/**
*
Select method
*
@
ejb
.
select
*
query = "SELECT user
.
email FROM GroupSchema AS g
,
IN (g
.
users) AS user WHERE g
.
name = ?
1
"
*
*/
public
abstract
java.util.
Collection
ejbSelectUserIDs(
String
groupName)
throws
javax.ejb.FinderException;
/**
*
Home method
*
@throws
FinderException
*
@
ejb
.
home
-
method view
-
type = "local"
*/
public
java.util.ArrayList ejbHomeGetUserIDs(
String
groupName)
throws
javax.ejb.FinderException {
return
(java.util.ArrayList) ejbSelectUserIDs(groupName);
}
// ######################## CMR Relationship ##############################
/**
*
Getter for CMR Relationship
*
*
@
ejb
.
interface
-
method view
-
type="local"
*
@
ejb
.
relation name = "GroupsHaveUserInfos"
*
role
-
name = "GroupHasUserInfos"
*
target
-
multiple = "no"
*/
public
abstract
java.util.
Collection
getUsers();
/**
*
Setter for CMR Relationship
*
*
@
ejb
.
interface
-
method view
-
type="local"
*/
public
abstract
void
setUsers(java.util.
Collection
value);
}
二、在UserManagementBean中添加業務方法
1. 增加一個 GroupLocalHome 的變量 groupHome,并將它放入 ejbCreate 和 ejbPassivate 方法中。
2. 依次增加以下幾個業務方法。
|
UserManagementBean中有關 GroupBean 的部分(很簡單) |
//**********************************************************************
// 一對多的雙向關系
//**********************************************************************
/**
*
創建組別
*
@throws
CreateException
*
@
ejb
.
interface
-
method view
-
type="remote"
*/
public
void
createGroup(
String
groupName,
String
description)
throws
CreateException {
groupHome.create(groupName, description);
}
/**
*
刪除組別
*
@throws
RemoveException
*
@throws
EJBException
*
@
ejb
.
interface
<span style
|
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元


評論