myRoster.createPlayer(new PlayerDetails("P1", "Phil Jones",
"goalkeeper", 100.00));
|
2、RosterEJB
RosterEJB这个session bean的createPlayer方法创建了PlayerEJB这个entity bean的一个新的实例。因为对PlayerEJB的访问是在本地进行的,所以create方法是在local home接口LocalPlayerHome中定义的。playerHome对象的类型是LocalPlayerHome。下面是createPlayer方法的源代码:
public void createPlayer(PlayerDetails details) {
try {
LocalPlayer player = playerHome.create(details.getId(),
details.getName(), details.getPosition(),
details.getSalary());
} catch (Exception ex) {
throw new EJBException(ex.getMessage());
}
}
|
3、PlayerEJB
ejbCreate方法通过调用set访问方法将输入参数赋予bean的持续化字段。在调用ejbCreate方法后,容器通过一个SQL INSERT语句将持续化字段存入数据库。下面是ejbCreate方法的代码:
public String ejbCreate (String id, String name,
String position,double salary) throws CreateException {
setPlayerId(id);
setName(name);
setPosition(position);
setSalary(salary);
return id;
}
|
将一个队员加入到一个运动队
1、RosterClient
RosterClient调用RosterEJB这个session bean中的名为addPlayer的商业方法。P1和T1参数分别是PlayerEJB实例和TeamEJB实例的主键。
myRoster.addPlayer("P1", "T1");
|
2、RosterEJB
addPlayer方法分两步执行。首先,它调用findByPrimaryKey以定位PlayerEJB实例和TeamEJB实例。然后,它调用TeamEJB这个entity bean的addPlayer商业方法。下面是RosterEJB这个session bean中addPlayer方法的源代码:
public void addPlayer(String playerId, String teamId) {
try {
LocalTeam team = teamHome.findByPrimaryKey(teamId);
LocalPlayer player =
playerHome.findByPrimaryKey(playerId);
team.addPlayer(player);
} catch (Exception ex) {
throw new EJBException(ex.getMessage());
}
}
|
3、TeamEJB
TeamEJB这个entity bean有一个名为players的关联字段,这是一个标志队员所属队的Collection。对players关联字段的访问方法如下:
public abstract Collection getPlayers();
public abstract void setPlayers(Collection players);
|
TeamEJB的addPlayer方法调用getPlayers访问方法以获取关联的LocalPlayer对象的Collection。然后,addPlayer方法调用Collection接口的add方法。下面是addPlayer方法的源代码:
public void addPlayer(LocalPlayer player) {
try {
Collection players = getPlayers();
players.add(player);
} catch (Exception ex) {
throw new EJBException(ex.getMessage());
}
}
|
删除一个队员
1、RosterClient
要删除一个队员P4,客户端会调用RosterEJB这个session bean中的removePlayer方法:
myRoster.removePlayer("P4");
|
2、RosterEJB
removePlayer方法通过调用findByPrimaryKey定位PlayerEJB实例,然后在这个实例中调用remove方法。这个调用将通知容器在数据库中删除与PlayerEJB实例相应的行。容器同时会从TeamEJB的players关联字段中删除相应项目。通过这个删除,容器自动更新TeamEJB-PlayerEJB关联关系。下面是RosterEJB中的removePlayer方法的源代码:
public void removePlayer(String playerId) {
try {
LocalPlayer player =
playerHome.findByPrimaryKey(playerId);
player.remove();
} catch (Exception ex) {
throw new EJBException(ex.getMessage());
}
}
|
从一个运动队中去除一个队员
1、RosterClient
要将队员P2从运动队T1中去除,客户端会调用RosterEJB中的dropPlayer方法:
myRoster.dropPlayer("P2", "T1");
|
2、RosterEJB
dropPlayer方法通过调用PlayerEJB实例和TeamEJB实例的findByPrimaryKey方法获取这两个实例。然后,它调用TeamEJB的dropPlayer商业方法。RosterEJB的dropPlayer方法如下: