熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

一個CMP的例子(一)

2013-11-15 11:39:53  來源: JSP教程 

  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;
  }
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19402.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.