EJB设计模式2

为了避免设计模式1的缺点,我们介绍一下封装
entitybean值域的valueobjec的概念。valueobject,
用某些语言的术语来说,就是一个结构类型,因为他们
和corba的结构类型非常类似。


ValueObjectcodesnippetforCompany
publicclassCompanyStructimplements
java.io.Serializable{
publicIntegercomId;//PrimaryKey
publicStringcomName;
publicStringcomDescription;
publicjava.sql.TimestampmutationDate;
}

ValueObjectcodesnippetforEmployee
publicclassEmployeeStructimplements
java.io.Serializable{
publicIntegerempId;//PrimaryKey
publicIntegercomId;//ForeignKey
publicStringempFirstName;
publicStringempLastName;
publicjava.sql.TimestampmutationDate;
}

现在,公司和雇员的entitybean可以把上面的一个结构类型作为
ejbCreate()的一个参数。由于这个结构封装了entity的所有字段
的值,entitybean只需要一个getdata()和setdata()方法就可以
对所有的字段进行操作。


CodesnippetforanEntityBean’screate()
publicIntegerejbCreate(CompanyStructstruct)throws
CreateException{
this.comId=struct.comId;
this.comName=struct.comName;
this.comDescription=struct.comDescription;
this.mutationDate=struct.mutationDate;
returnnull;
}
CodesnippetforanEntityBean’sgetData()
publicCompanyStructgetData(){
CompanyStructresult=newCompanyStruct();
result.comId=this.comId;
result.comName=this.comName;
result.comDescription=this.comDescription;
result.mutationDate=this.mutationDate;
returnresult;
}
CodesnippetforanEntityBean’ssetData()
publicvoidsetData(CompanyStructstruct){
this.comName=struct.comName;
this.comDescription=struct.comDescription;
this.mutationDate=struct.mutationDate;;
}


跟设计模式1中使用单独的get()和set()方法去操作特定字段不同,
在设计模式2中,我们避免这种情况而只需要进行一次远程调用就
可以了。现在,只有一个事务通过一次远程调用就操作了所有的数
据。这样,我们就避免了设计模式1的大部分缺点,除了建立bean
之间的关系外。
虽然setdata()方法可以对所有字段赋值,但是,borlandappserver
提供了一种智能更新的特性,只有被修改过的字段才会被重新写入数
据库,如果没有字段被修改,那么ejbStore()方法将会被跳过。
borland程序员开发指南(EJB)有更详细的描述。
同样,在entitybean和struct之间存在这重复的代码,比如同
样的字段声明。这意味着任何数据库表结构的修改都会导致
entitybeabn和struct的改变,这使得同步entity和struct变得
困难起来。
一个小小的改进可以从一定程度上避免这种情况,
就是在ebCreate()方法中调用setddata()方法,这可以消除一
些冗余的代码。


CodesnippetforanEntityBean’screate()
publicIntegerejbCreate(CompanyStructstruct)throws
CreateException{
this.comId=struct.comId;//settheprimarykey
setData(struct);//thisremovessomeredundantcode
returnnull;
}

你可能感兴趣的:(设计模式)