分享
 
 
 

一个CMP的例子(一)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

Container-Managed Persistence Examples一个container-managed的实体bean带给开发人员很多好处。

首先,EJB容器管理所有数据库的存储与同步指令;其次容器管理实体bean之间的关系。

由于这些服务的存在,你不用去编写数据库逻辑,你所要做的只是在配置描述里面描述这些信息,这样不仅可以节约时间而且使得bean可以在多种数据库服务器使用。

这章我们的实例是一个container-managed的实体bean。这个应用的名字叫RosterApp。

RosterApp总揽:

这个RosterApp应用程序维持在一些体育运动联盟的球员的名单以及球队的名单。这个应用程序有5个组件。RosterAppClient组件是一个客户端组件,

他通过RosterEJB会话bean的romote接口访问RosterEJB。

RosterEJB访问3个实体bean-PlayerEJB, TeamEJB, and LeagueEJB,这些访问是通过3个实体bean的local接口。

这些实体bean采用CMP方式,TeamEJB和PlayerEJB的关系是多对多的双向的,LeagueEJB和TeamEJB的关系也是双向的,但是是一对多的关系。

编写PlayerEJB

这个实体bean代表一个存储在数据库的球员,像所有的CMP实体bean,PlayEJB需要如下的代码:

1 Entity bean class (PlayerBean)

2 Local home interface (LocalPlayerHome)

3 Local interface (LocalPlayer)

Entity bean class

为了实现CMP,这个实体bean的类必须是public和abstract的。同时也必须实现以下的条件:

1 EntityBean interface

2 0个或者多个ejbCreate和ejbPostCreate方法

3 get和set抽象方法。

4 一些抽象的select方法

5 home方法

6 商业方法

这个bean不能实现的方法:

1 finder方法

2 finalize方法

Access方法

一个CMP实体bean有persistent和relationship,这些是虚拟的,所以你不用把他们定义为实例变量。

你所作的只是在配置时描述他。但是你需要定义get和set方法。容器自动管理数据库的存储和同步,

配置中这些persistent需要被容器维持:

1 playerId (primary key)

2 name

3 position

4 salary

我们需要这些方法访问这些:

public abstract String getPlayerId();

public abstract void setPlayerId(String id);

public abstract String getName();

public abstract void setName(String name);

public abstract String getPosition();

public abstract void setPosition(String position);

public abstract double getSalary();

public abstract void setSalary(double salary);

这些方法的名字以get或者set开头,后面跟着persistent的名字。

这和JeanBean是一样的。

同时我们需要Access方法访问Relationship在这个应用程序中,因为一个球员可以在多个球队效力,所以一个PlayerEJB对象可以和很多TeamEJB相关。我们定义这个Relationship名字为teams,接下来我们需要定义这些Access方法。

public abstract Collection getTeams();

public abstract void setTeams(Collection teams);

Select方法

一个Select方法和一个Finder方法类似:

1 一个Select可以放回一个local或者remote接口(或者一个集合)

2 一个Select需要一个query连接数据库

3 需要自己在配置中定义一个EJB QL

4 bean类不需要实现这个方法

但是2者也有不同的地方:

1 一个select方法可以返回相关联的bean一个persistent(或者集合),一个finder只能返回local或者remote接口。

2 由于select方法不在local或者remote接口,一个select方法不能直接被客户调用,只能被这个bean的内部方法调用。

通常被一个商业方法调用。这个程序中定义了如下的select方法:

public abstract Collection ejbSelectLeagues(LocalPlayer player)

throws FinderException;

public abstract Collection ejbSelectSports(LocalPlayer player)

throws FinderException;

select方法名必须满足:

1 前缀必须是ejbSelect

2 access控制访问是public的

3 abstract

4 抛出的exception必须包含javax.ejb.FinderException

商业方法由于select方法不能被客户直接调通,所以将他们包含在商业方法中:

public Collection getLeagues() throws FinderException {

LocalPlayer player = (team.LocalPlayer)context.getEJBLocalObject();

return ejbSelectLeagues(player);

}

public Collection getSports() throws FinderException {

LocalPlayer player = (team.LocalPlayer)context.getEJBLocalObject();

return ejbSelectSports(player);

}

实体bean方法

由于是CMP,所以bean的生命周期方法基本不用实现

ejbCreate方法:

public String ejbCreate (String id, String name, String position, double salary) throws CreateException {

setPlayerId(id);

setName(name);

setPosition(position);

setSalary(salary);

return null;

}

注意return null除非debug的需要,ejbRemove方法一般都是空的。当容器调用这个方法后,容器删除数据库中的纪录。

ejbPostCreate方法和ejbCreate方法的参数和返回类型一样,如果你想建立一个关系,你应该把代码写在ejbPostCreate方法中。

容器会自动管理同步,存储等数据库操作,这些通过ejbLoad和ejbStore方法完成。

local home interface:

这里定义了creat,finder和其他一些home方法。

package team;

import java.util.*;

import javax.ejb.*;

public interface LocalPlayerHome extends EJBLocalHome {

public LocalPlayer create (String id, String name, String position, double salary)

throws CreateException;

public LocalPlayer findByPrimaryKey (String id)

throws FinderException;

public Collection findByPosition(String position)

throws FinderException;

...

public Collection findByLeague(LocalLeague league)

throws FinderException;

...

}

loca interface:

这里定义了一些商业方法,这些方法有bean实现,同时也定义了get和set方法,set方法不应该被暴露出来。

package team;

import java.util.*;

import javax.ejb.*;

public interface LocalPlayer extends EJBLocalObject {

public String getPlayerId();

public String getName();

public String getPosition();

public double getSalary();

public Collection getTeams();

public Collection getLeagues() throws FinderException;

public Collection getSports() throws FinderException;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有