public ArrayList getPlayersOfTeamCopy(String teamId) {
ArrayList playersList = null;
try {
LocalTeam team = teamHome.findByPrimaryKey(teamId);
playersList = team.getCopyOfPlayers();
} catch (Exception ex) {
throw new EJBException(ex.getMessage());
}
return playersList;
}
|
3、TeamEJB
TeamEJB的getCopyOfPlayers方法返回一个PlayerDetails对象的ArrayList。要创建这个ArrayList,方法遍历相关LocalPlayer对象的Collection并拷贝信息到PlayerDetails对象的变量中。这个方法拷贝了PlayerEJB持续化字段的值--不过salary字段是个例外,它被设置为零。这样做的结果是,一个队员的薪水对于调用getPlayersOfTeamCopy方法的客户端是不可见的。TeamEJB的getCopyOfPlayers方法的源代码如下:
public ArrayList getCopyOfPlayers() {
ArrayList playerList = new ArrayList();
Collection players = getPlayers();
Iterator i = players.iterator();
while (i.hasNext()) {
LocalPlayer player = (LocalPlayer) i.next();
PlayerDetails details =
new PlayerDetails(player.getPlayerId(),
player.getName(), player.getPosition(), 0.00);
playerList.add(details);
}
return playerList;
}
|
通过位置寻找一个队员
1、RosterClient
客户端通过调用RosterEJB的getPlayersByPosition方法开始这一过程:
playerList = myRoster.getPlayersByPosition("defender");
|
2、RosterEJB
getPlayersByPosition方法通过调用PlayerEJB的findByPosition方法获取players的列表:
public ArrayList getPlayersByPosition(String position) {
Collection players = null;
try {
players = playerHome.findByPosition(position);
} catch (Exception ex) {
throw new EJBException(ex.getMessage());
}
return copyPlayersToDetails(players);
}
|
3、PlayerEJB
LocalPlayerHome接口定义了findByPosition方法:
public Collection findByPosition(String posistion)
throws FinderException;
|
因为PlayerEJB使用了容器管理持续化,所以entity bean类(PlayerBean)不能实现它的finder方法。为了指定与finder方法相关的查询,必须在bean的部署描述中定义EJB QL查询。例如,findByPosition方法对应于这样一个EJB QL查询:
SELECT DISTINCT OBJECT(p) FROM Player p
WHERE p.position = ?1
|
deploytool将EJB QL查询转换成一个SQL SELECT语句。在运行时,容器调用findByPosition方法会导致SQL SELECT语句的执行。
有关EJB QL的详细情况,请参看第八章。有关如何在deploytool中显示和编辑一个EJB QL查询,参看Finder/Select Methods对话框(PlayerEJB)。
获取一个队员的运动项目
1、RosterClient
客户端调用RosterEJB中的getSportsOfPlayer方法:
sportList = myRoster.getSportsOfPlayer("P28");
|
2、RosterEJB
getSportsOfPlayer方法返回一个反映指定队员的运动项目的String对象的ArrayList。它通过PlayerEJB的getSports商业方法返回的Collection构造这个ArrayList。下面是 RosterEJB的getSportsOfPlayer方法的源代码:
public ArrayList getSportsOfPlayer(String playerId) {
ArrayList sportsList = new ArrayList();
Collection sports = null;
try {
LocalPlayer player =
playerHome.findByPrimaryKey(playerId);
sports = player.getSports();
} catch (Exception ex) {
throw new EJBException(ex.getMessage());
}
Iterator i = sports.iterator();
while (i.hasNext()) {
String sport = (String) i.next();
sportsList.add(sport);
}
return sportsList;
}
|
3、PlayerEJB
getSports方法中封装了ejbSelectSports方法。因为ejbSelectSports方法的参数的类型是LocalPlayer,而对于getSports方法传递的是一个指向entity bean实例的索引。PlayerBean类执行getSports方法的代码如下:
public Collection getSports() throws FinderException {
LocalPlayer player =
(team.LocalPlayer)context.getEJBLocalObject();
return ejbSelectSports(player);
}
|
PlayerBean类中定义了ejbSelectSports方法: