容器管理持续化示例 |
3、TeamEJB
dropPlayer方法更新了TeamEJB-PlayerEJB关联关系。首先,方法接受对应于players关联字段的LocalPlayer对象的Collection。然后,它通过调用Collection接口的remove方法以去除目标player。下面是TeamEJB的dropPlayer方法:
|
从一个运动队中获取一个队员
1、RosterClient
客户端可以通过调用RosterEJB这个session bean中的getPlayersOfTeam方法获得运动队中的队员。这个方法返回PlayerDetails对象的ArrayList。一个PlayersDetails对象包含四个变量--playerId、name、position和salary--这是PlayerEJB持续化字段的拷贝。RosterClient调用getPlayersOfTeam方法的代码如下:
|
2、RosterEJB
RosterEJB这个session bean的getPlayersOfTeam方法通过调用findByPrimaryKey方法以定位目标队对应的LocalTeam对象。然后,getPlayersOfTeam方法调用TeamEJB中的getPlayers方法。下面是getPlayersOfTeam方法的源代码:
|
getPlayersOfTeam方法返回PlayerDetails对象的ArrayList,上述的那个对象是由copyPlayersToDetails方法生成的:
|
3、TeamEJB
TeamEJB中的getPlayers方法是针对players这个关联字段的访问方法:
|
这个方法对于本地客户端是可见的,这是因为它被定义在local接口LocalTeam中:
|
当被一个本地客户端调用时,一个get访问方法会返加一个关联字段的索引。如果本地客户端改变了由get访问方法返回的对象,在entity bean中的关联字段的值也会随之改变。例如,一个TeamEJB的本地客户端可以这样从一个运动队中去除一个队员:
|
如果你想要防止一个本地客户端这样修改一个关联字段,你应该更加注意我们在下面所讲的内容。
获取一个运动队队员的拷贝
与上面讨论的方法不同,在这一章我们讨论的方法为我们示范了以下技术:
1、对传输到远程客户端的信息进行过滤
2、防止本地客户端直接对关联字段进行修改
1、RosterClient
如果你不想让远程客户端了解到队员的薪水,你可能需要调用RosterEJB中的getPlayersOfTeamCopy方法,和getPlayersOfTeam方法类似,getPlayersOfTeamCopy方法也返回一个PlayerDetails对象的ArrayList。然而,getPlayersOfTeamCopy返回的对象有所不同--它们的salary变量被统一置为零。RosterClient调用getPlayersOfTeamCopy方法的代码如下:
|
2、RosterEJB
与getPlayersOfTeam方法不同,getPlayersOfTeamCopy方法不调用LocalTeam接口中的getPlayers访问方法。取而代之的是,getPlayersOfTeamCopy方法通过调用LocalTeam接口中的getCopyOfPlayers商业方法以获得队员信息的拷贝。这样做的结果是,getPlayersOfTeamCopy方法不能修改TeamEJB的关联字段players。下面是RosterEJB中getPlayersOfTeamCopy方法的源代码: