程序员:EJB设计模式5
就像我们在设计模式4中看到的, Entity Bean的实现大小被缩减到在ejbCreat(), getData()and setData()方法中的仅仅几行,不管CMP字段的数目.下一步是建模公司和雇员的Entity Beans,这个有点繁琐而且建议读者先对borland公司的
象以前, 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)
}
}
0条评论