Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

容器管理持续化示例

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]


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方法:


public abstract Collection ejbSelectSports(LocalPlayer player) 
throws FinderException;


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:在GoF模式以外(1)   下一篇:Bean管理持续化实例

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章