服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

一个cmp的例子(一)


  container-managed persistence examples一个container-managed的实体bean带给开发人员很多好处。
  首先,ejb容器管理所有数据库的存储与同步指令;其次容器管理实体bean之间的关系。
  由于这些服务的存在,你不用去编写数据库逻辑,你所要做的只是在配置描述里面描述这些信息,这样不仅可以节约时间而且使得bean可以在多种数据库服务器使用。
  
  这章我们的实例是一个container-managed的实体bean。这个应用的名字叫rosterapp。
  
  rosterapp总揽:
  这个rosterapp应用程序维持在一些体育运动联盟的球员的名单以及球队的名单。这个应用程序有5个组件。rosterappclient组件是一个客户端组件,
  他通过rosterejb会话bean的romote接口访问rosterejb。
  rosterejb访问3个实体bean-playerejb, teamejb, and leagueejb,这些访问是通过3个实体bean的local接口。
  
  这些实体bean采用cmp方式,teamejb和playerejb的关系是多对多的双向的,leagueejb和teamejb的关系也是双向的,但是是一对多的关系。
  
  编写playerejb
  这个实体bean代表一个存储在数据库的球员,像所有的cmp实体bean,playejb需要如下的代码:
  1 entity bean class (playerbean)
  2 local home interface (localplayerhome)
  3 local interface (localplayer)
  
  entity bean class
  为了实现cmp,这个实体bean的类必须是public和abstract的。同时也必须实现以下的条件:
  1 entitybean interface
  2 0个或者多个ejbcreate和ejbpostcreate方法
  3 get和set抽象方法。
  4 一些抽象的select方法
  5 home方法
  6 商业方法
  这个bean不能实现的方法:
  1 finder方法
  2 finalize方法
  
  access方法
  一个cmp实体bean有persistent和relationship,这些是虚拟的,所以你不用把他们定义为实例变量。
  你所作的只是在配置时描述他。但是你需要定义get和set方法。容器自动管理数据库的存储和同步,
  配置中这些persistent需要被容器维持:
  1 playerid (primary key)
  2 name
  3 position
  4 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方法类似:
  1 一个select可以放回一个local或者remote接口(或者一个集合)
  2 一个select需要一个query连接数据库
  3 需要自己在配置中定义一个ejb ql
  4 bean类不需要实现这个方法
  但是2者也有不同的地方:
  1 一个select方法可以返回相关联的bean一个persistent(或者集合),一个finder只能返回local或者remote接口。
  2 由于select方法不在local或者remote接口,一个select方法不能直接被客户调用,只能被这个bean的内部方法调用。
  通常被一个商业方法调用。这个程序中定义了如下的select方法:
  
  public abstract collection ejbselectleagues(localplayer player)
    throws finderexception;
  public abstract collection ejbselectsports(localplayer player)
    throws finderexception;
  
  select方法名必须满足:
  1 前缀必须是ejbselect
  2 access控制访问是public的
  3 abstract
  4 抛出的exception必须包含javax.ejb.finderexception
  
  商业方法由于select方法不能被客户直接调通,所以将他们包含在商业方法中:
  
  public collection getleagues() throws finderexception {
    localplayer player = (team.localplayer)context.getejblocalobject();
    return ejbselectleagues(player);
  }
  
  public collection getsports() throws finderexception {
    localplayer player = (team.localplayer)context.getejblocalobject();
    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:
  这里定义了creat,finder和其他一些home方法。
  
  package team;
  
  import java.util.*;
  import javax.ejb.*;
  
  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 java.util.*;
  import javax.ejb.*;
  
  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;
  }

扫描关注微信公众号