国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

EJB設計模式5

2019-11-18 12:36:33
字體:
來源:轉載
供稿:網友


  就像我們在設計模式4中看到的, Entity Bean的實現大小被縮減到在ejbCreate(), getData()and setData()方法中的僅僅幾行,不管CMP字段的數目.下一步是建模公司和雇員的Entity Beans,這個有點繁瑣而且建議讀者先對borland公司的<EJB程序員指南>的OR Mapping和高級CMP有所了解.
  對這個關系建模根本不需要對結構的代碼變化,然而Entity Beans實現類需要一點點修改來反映兩個實體間的關系,鑒于此Deployment Descriptor需要有小的修改.
  
  象以前, Entity Bean從結構繼續,下面是公司Entity Bean的代碼片段:
  public class CompanyBean extends CompanyStrUCt
  implements EntityBean {
  EntityContext entityContext;
  // CMP for all fields in the CompanyStruct
  public java.util.Collection employees; //one-to-many
  //rest of the code including getData() and setData()
  public java.util.Collection getEmployees() {
  return employees;
  }
  }
  
  下面是雇員Entity Bean的程序片段:
  public class EmployeeBean extends EmployeeStruct
  implements EntityBean {
  EntityContext entityContext;
  //CMP for all fields in EmployeeStruct EXCEPT
  //the comId
  public Company company;//remote reference to company
  }
  
  在上面的程序片段中,雇員Entity Bean從雇員結構繼續,雇員結構本身有一個字段comId表示雇員和公司之間的的外鍵,在所有的前面的設計模式中,這個字段是CMP的.而在設計模式5中這個字段用在Deployment Descriptor中un-checking的方法從CMP中去掉.而對公司Entity Bean的遠程引用現在是CMP的.現在的問題是怎么在getData()和SetData()方法中更新公司Entity Bean的引用,當這些方法只get和set comId(在設計模式上下文中沒有被CMP)的值.簡單的說,過程的結構沒有變化并且字段comId(不再CMP)在RPC中被拷貝到Entity Bean和從Entity Bean拷貝出來.需要的是對公司Entity Bean的遠程引用在必須被寫入數據庫和從數據庫讀出時更新.我們需要用ejbLoad()和ejbStore()方法在Entity Bean實現類中為我們完成這項工作.
  在雇員Entity Bean中的ejbLoad()方法的代碼片段如下:
  
  public void ejbLoad() {
  try {
  comId=(company ==
  
  
  null)?null:(Integer)company.getPRimaryKey();
  } catch (Exception e) {
  //throw some runtime exception (e.g. EJBException)
  }
  }
  
  
  以上代碼幾乎不需要解釋.當數據被從數據庫中讀出(在事務的開始時候),comId(不是CMP)字段在雇員Entity Bean被set.因此當getData()方法被調用時,返回的結構將包含正確地comId的值.在雇員Entity Bean中的ejbStore()方法如下:
  
  public void ejbStore() {
  try {
  company = (comId ==
  null)?null:beanGlossary.getCompanyHome().findByPrimary
  Key(comId);
  } catch (Exception e) {
  //throw some runtime exception (e.g. EJBException)
  }
  }
  
  
  ejbStore()在事務結束當數據被寫入數據庫時被調用.在這種情況下,comId的值被修改(通過調用setData方法),this必須被寫到數據庫中.在上面方法中的代碼把comId轉化成公司的遠程引用.(究竟comId是公司Entity Bean的主鍵).使用空check的原因是數據庫不能存空值(表之間的弱引用),并且這些同樣需要建模.
  
  任何情況下,用java對基本類型的封裝要比使用基本類型自己好,因為他們能存空值而且易于轉換成其他形式.
  上面的BeanGlossary類的代碼片斷輕易引起一些混淆.這實際上是一個捕捉EJB的lookup的utility類(一個無狀態session bean),
  在entity bean和有狀態session bean的情況下,Home接口的lookup是被緩沖的.在無狀態session bean的情況下,Remote接口是被緩沖的(作為ejb規范1.1的一部分,一個SLSB在Home接口中調用的create()是不被優化的).通過在上面上下文的緩沖,我們意思是第一個請求是被lookup的.隨后的調用是得到已經在對象引用中初始化的home接口或remote接口.
  BeanGlossarySB utility類的代碼片段如下:
  
  public class BeanGlossarySB implements SessionBean {
  private Context context = null;
  public javax.naming.Context getContext() throws
  NamingException {
  if (context == null)
  context = new javax.naming.InitialContext();
  return context;
  }
  // Company
  private CompanyHome companyHome = null;
  public CompanyHome getCompanyHome() throws
  NamingException {
  
  
  companyHome = ((CompanyHome)
  javax.rmi.PortableRemoteObject.narrow(
  getContext().lookup("java:comp/env/ejb/Company"),
  CompanyHome.class));
  return companyHome;
  }
  // rest of the EJBs
  }
  
  在設計模式5中,我們沒有處理Entity Bean的Home接口.在雇員Entity Bean的情況下, 會有一個finder元素在findEmployeesByCompany(Company pCompany)的幾行中,這將會返回雇員遠程引用的集合. 在公司Entity Bean 中的Deployment Descriptor map了在上面定義的finder元素的雇員集合.
  這樣,在公司Entity Bean中的方法getEmployees()在remote接口中的調用返回需要的與那家公司相聯系的遠程引用的雇員的集合.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玛多县| 碌曲县| 松阳县| 永仁县| 搜索| 博野县| 北海市| 陈巴尔虎旗| 大埔县| 宜兰县| 丽水市| 武清区| 上栗县| 张家港市| 屯昌县| 胶南市| 吉首市| 南昌县| 拜泉县| 五大连池市| 延吉市| 南丰县| 兴和县| 维西| 金堂县| 瑞丽市| 香港 | 北海市| 贵州省| 翁牛特旗| 云林县| 台江县| 大城县| 宜川县| 通海县| 麻栗坡县| 林口县| 莱阳市| 荆州市| 彭水| 肥西县|