Java 版 (精华区)

发信人: bali (阿奔), 信区: Java
标  题: Enterprise JavaBeans导论四
发信站: 哈工大紫丁香 (2000年09月22日10:58:30 星期五), 站内信件

Enterprise JavaBeans导论四
实体bean
实体bean的角色
实体bean用来代表底层的对象。最常用的是用实体bean代表关系库中的数据。一个简单
的实体bean可以定义成代表数据库表的一个记录,也就是每一个实例代表一个特殊的记
录。更复杂的实体bean可以代表数据库表间关联视图。在实体bean中还可以考虑包含厂
商的增强功能,如对象--关系映射的集成。
通常用实体类代表一个数据库表比代表多个相关联的表更简单且更有效。反过来可以轻
易地向实体类的定义中增加关联,这样可以最大地复用cache并减小旧数据的表现。
实体bean和对话bean的比较
看起来会话bean好象没什么用处,尤其对于数据驱动的应用程序。当然事实并不是这样
。因为实体bean(譬如说)代表底层数据库的一行,则实体bean实例和数据库记录间就
是一对一的关系。因为多个客户端必须访问底层记录,这意味着,不同于会话bean,客
户端必须共享实体bean。因为是共享的,所以实体bean不允许保存每个客户端的信息。
会话bean允许保存客户端的状态信息,客户端和会话bean实例间是一对一的。实体bean
允许保存记录的信息,实体bean实例和记录间是一对一的。一个理想的情况是客户端通
过会话bean连接服务器,然后会话bean通过实体bean访问数据库。这使得既可以保存客
户端的信息又可以保存数据库记录的信息。
同时会话bean也不能提供在相同或不同的EJB类调用间进行全局的事务控制。没有会话b
ean,应用程序开发者(客户端开发者)就必须理解EJB类的事务要求,并使用客户端的
事务划分来提供事务控制。EJB的主要好处就是应用开发者不需知道EJB类的事务需求。
一个会话bean可以代表一个商业操作,进行事务控制,不需要客户端进行事务划分。
Finder方法
通过home或remote interface创建和删除bean的实例,对实体bean和会话bean来说有不
同的含义。对会话bean来说,删除意味着从容器中删除,不能再使用,并且其状态信息
也丢失了。对于实体bean,删除意味着底层数据库记录被删除了。因此,一般不把删除作
为实体bean生命周期的一部分。
创建一个实体bean意味着一个记录被插进数据库中。与删除操作类似,创建操作通常也
不作为实体bean生命周期的一部分。客户端访问实体bean需要先找到它。除了create()
方法,一个实体bean的home interface还有finder方法。客户端需要根据应用程序的限
制来识别一个特殊的数据库记录。例如:
public interface AccountHome extends EJBHome {
public Account findByFirstLast(String first, String last)
                  throws RemoteException,FinderException;
public Account findByAccountNumber(String acctNum)
                  throws RemoteException,FinderException;
}
当客户端调用home object的任何方法,容器把调用传递到实体bean的相应方法中。
Public class myEntityBean implements EntityBean {

public Obejct ejbFindByFirstLast(String first, String last) {
//runs appropriate singleton SELECT statement
//returns primary key for selected row
}
public Obejct ejbFindByAccountNumber(String acctNum) {
//runs appropriate singleton SELECT statement
//returns primary key for selected row
}
}
一个较好的方法是把finder方法当成数据库的SELECT语句,而动态SQL参数相当于方法的
参数。注意home interface中的finder方法向客户端返回一个对EJBObject的远程引用。
Bean中的Finder方法向容器返回一个唯一的标识符,称为主键。容器用这个主键实例化
一个代表选定的记录的EJBObject。不论如何实现finder方法,容器都用这个主键代表这
个选定的记录,由实体类来决定如何用唯一的标识符来代表记录。
由可能一个finder方法得到满足SELECT语句条件的多个记录。这种情况下bean的finder
方法返回一个主键的枚举类型。Home interface的Finder方法定义成向客户端返回EJBO
bject引用的枚举类型。
Public interface AccountHome extends EJBHome {

public Enumeration findByCompany(String companyName)
                      throws RemoteException,FinderException;
}
public class myEntityBean implements EntityBean {

public Enumeration ejbFindByCompany(String companyName) {
//runs appropriate SELECT statement
//returns an Enumeration of primary keys
}
}
主键
主键这个词有可能被曲解。把它理解为唯一的标识符更恰当些。当实体bean代表一个数
据库记录时,主键可能是该记录的组合键。对于每个实体bean的实例,有一个相应的EJ
BObject.当一个EJBObject与一个实体bean实例对应时,该实例的主键保存在EJBObject
中。
这时说该实体bean的实例有一个标识符。当客户端调用home object的finder方法时,容
器会用没有标识符的实体bean的实例来执行这个请求。容器可能为此维持一个甚至多个
匿名的实例。不论如何实现finder方法,都必须向容器返回底层数据的主键,如数据库
的记录。如果多个记录满足条件,那么就返回多个主键。当容器得到主键后,它会用该
主键初始化一个EJBObject.容器也可以初始化一个与每个EJBObject关联的实体bean的实
例。因为底层记录的标识符在EJBObject中保存,因此在bean实例中没有状态。因此,容
器可以在EJBObject上调用商业方法时再实例化bean,以节省内存资源。
当finder方法向容器返回主键时,容器首先会检查该主键的EJBObject是否已经存在。如
果该主键的EJBObject已经存在,那么容器不会创建一个新的EJBObject,而是向客户端返
回这个已存在的EJBObject的引用。这样就保证了每个记录只有一个EJBObject的实例,
所有的客户端共享EJBObject.
主键只是在该类中唯一地标识bean的实例,容器负责保证其范围。应该明确finder方法
只是从数据库中取出数据的主键,而不包含其它的数据项。也可能调用finder方法后不
产生任何实体bean的实例,只产生包含该主键的EJBObject,当客户端调用EJBObject的
方法时在产生并导入实体bean的实例。 Home object保证客户端可以访问以下方法:
public myRem findByPrimaryKey(Obejct key) throws …;
EJBObject提供以下方法的一个实现:
Public Object getPrimaryKey();
客户端能在任何时候获得实体bean的主键,并且以后可以使用该主键通过home interfa
ce重建对实体的引用。主键类的类型在部署描述符中指定。Bean开发者可以用任何类类
型来表示主键。唯一的要求是类必须实现serializable,因为主键可能在客户和服务器
间传递。

--



  在时间面前,没有永恒
      
         ------一个热爱自由的人

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 211.99.237.22]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.550毫秒