Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1530242
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 19:48:24

一起学习
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;

}
下载本文示例代码


一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)一个CMP的例子(一)
阅读(185) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~