ContainerManaged Persistence Examples一个containermanaged的实体bean带给开发人员很多好处 首先EJB容器管理所有数据库的存储与同步指令其次容器管理实体bean之间的关系 由于这些服务的存在你不用去编写数据库逻辑你所要做的只是在配置描述里面描述这些信息这样不仅可以节约时间而且使得bean可以在多种数据库服务器使用 这章我们的实例是一个containermanaged的实体bean这个应用的名字叫RosterApp RosterApp总揽 这个RosterApp应用程序维持在一些体育运动联盟的球员的名单以及球队的名单这个应用程序有个组件RosterAppClient组件是一个客户端组件 他通过RosterEJB会话bean的romote接口访问RosterEJB RosterEJB访问个实体beanPlayerEJB TeamEJB and LeagueEJB这些访问是通过个实体bean的local接口 这些实体bean采用CMP方式TeamEJB和PlayerEJB的关系是多对多的双向的LeagueEJB和TeamEJB的关系也是双向的但是是一对多的关系 编写PlayerEJB 这个实体bean代表一个存储在数据库的球员像所有的CMP实体beanPlayEJB需要如下的代码 Entity bean class (PlayerBean) Local home interface (LocalPlayerHome) Local interface (LocalPlayer) Entity bean class 为了实现CMP这个实体bean的类必须是public和abstract的同时也必须实现以下的条件 EntityBean interface 个或者多个ejbCreate和ejbPostCreate方法 get和set抽象方法 一些抽象的select方法 home方法 商业方法 这个bean不能实现的方法: finder方法 finalize方法 Access方法 一个CMP实体bean有persistent和relationship这些是虚拟的所以你不用把他们定义为实例变量 你所作的只是在配置时描述他但是你需要定义get和set方法容器自动管理数据库的存储和同步 配置中这些persistent需要被容器维持 playerId (primary key) name position 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方法类似 一个Select可以放回一个local或者remote接口(或者一个集合) 一个Select需要一个query连接数据库 需要自己在配置中定义一个EJB QL bean类不需要实现这个方法 但是者也有不同的地方 一个select方法可以返回相关联的bean一个persistent(或者集合)一个finder只能返回local或者remote接口 由于select方法不在local或者remote接口一个select方法不能直接被客户调用只能被这个bean的内部方法调用 通常被一个商业方法调用这个程序中定义了如下的select方法 public abstract Collection ejbSelectLeagues(LocalPlayer player) throws FinderException; public abstract Collection ejbSelectSports(LocalPlayer player) throws FinderException; select方法名必须满足 前缀必须是ejbSelect access控制访问是public的 abstract 抛出的exception必须包含javaxejbFinderException 商业方法由于select方法不能被客户直接调通所以将他们包含在商业方法中 public Collection getLeagues() throws FinderException { LocalPlayer player = (teamLocalPlayer)contextgetEJBLocalObject(); return ejbSelectLeagues(player); } public Collection getSports() throws FinderException { LocalPlayer player = (teamLocalPlayer)contextgetEJBLocalObject(); 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: 这里定义了creatfinder和其他一些home方法 package team; import javautil*; import javaxejb*; 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 javautil*; import javaxejb*; 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; } |