3.2容器管理模式
容器管理模式,就是EJB 容器控制着所有实体bean对数据库的访问。实体bean的代码中不用指定对数据库的访问调用。因此,bean的代码不必绑定到一个特定的数据库。因为有 了这样的柔和性,当你把用样的bean部署到不同的J2EE服务器上时,不需要改动或者重新编译代码。简单来说,你的实体bean更加独立。
为了产生数据库调用,容器需要收集你实体bean中抽象模式的信息。
抽象模式
作为实体bean部署描述的一部分,抽象模式定义了bean的持久性和联系性。“抽象”这个词区别出了这个模式和数据实际存储的物理模式。比如,在一个关系型数据库中,物理模式是由表和属性构成的。
你自己要在部署中指定抽象模式的名称。名称将被用JavaBeans Query Language(“EJB QL”)编写的队列引用。容器管理模式下,你必须为实体bean的所有查找方法(除了findByPrinaryKey)定义一个EJB QL队列。当查找方法被调用的时候,EJB容器就从队列中执行。更多信息请参看第8章。
你也许已经发现,在编写代码之前建立抽象模型是很有用的。表3-1表现三个实体bean中简单的抽象模型。他们之间更多的联系将在下面的章节中介绍。
Figure 3-1 A High-Level View of an Abstract Schema
持久性字段
一个实体bean的持久性字段被保存到的数据库中。总的来说,那些字段构成了bean的状态。在运行时中,EJB容器自动同步数据库中的这些状态。在部署中,EJB容器记录bean到数据库中的表,并且记录记录持久性字段到表中的属性。
例如,一个CustomerEJB 实体bean,有这样的持久性字段:firstName, lastName, phone, emailAddress。在持久性容器管理模式中,这些字段是虚拟的。你在抽象模式中声明了这些字段,但是没有在bean代码中编写他们的实例变量。代 替的是,这些字段在访问方法被确定。
联系性字段
一个联系性字段就犹如数据库表的外码,它确定一个与自己联系的bean。和持久性字段一样,联系性字段是虚拟的,是在企业bean中的访问方法中被确定的。但不同的是,联系性字段并不表示bean的状态。联系性字段在“ 容器管理模式中联系的方向性 (Direction in Container-Managed Relationships)“一章将被更详细地讨论。
3.3容器管理模式中联系性的多元性
这里,多元性有四种类型:
一对一:(One-to-one) 每一个实体bean的实例都和另一个实体bean的实例有关联。比如,在一个物理仓库存储模型中,每个存储箱都包含一个物品,StorageBinEJB和WidgetEJB就有一对一的关系。
一对多:(One-to-many) 一个实体bean的实例可能和多个其他的bean的实例相关联。比如,一个销售订单,可以有多个元组(多个订单)。在这样的订单应用中,OrderEJB对LineItemEJB有一对多的关系。
多对一:(Many-to-one) 多个实体bean的实例和一个实体bean的实例相关联。这种关联与一对多关联相反。例如,在上面所提到的,LineItemEJB对OrderEJB有多对一的关系。
多对多:(Many-to-many) 实体bean的实体之间相互都有多个联系。比如,在大学中,一个课程有多名学生选修,一名学生同时也选修多门课程。这样的应用中,CourseEJB和StudentEJB是多对多的关系。
3.4容器管理模式中联系的方向性
实 体bean之间的联系有单向和双向两种。在双向联系中,每个实体bean都有一个联系字段与对方相对应。通过这联系字段,实体bean的代码就能访问与它 相联系的bean。如果一个实体bean有一个联系字段,那么我们经常称之为bean能识别和它联系的bean。举个例子,如果OrderEJB知道 LineItemEJB有哪些实例,而且LineItemEJB也知道OrderEJB属于谁,那么它们之间的关系就是双向的。
在 单向联系中,仅仅只能其中一个实体bean有一个联系字段和另一个bean对应。例如,LineItemEJB有一个联系字段识别ProductEJB, 但是ProductEJB不能有联系字段和LineItemEJB对应。换句话说,LineItemEJB知道ProductEJB,但 ProductEJB不知道哪个LineItemEJB和它联系。
EJB QL队列经常用于定位这些联系。联系的方向性,由队列是否能定位一个bean到另一个bean来决定的。比如,一个队列能定位从LineItemEJB到 ProductEJB,但是不能定位从ProductEJB到LineItemEJB。如果LineItemEJB和ProductEJB有双向联系,那 么队列能双向定位。
3.5什么时候用Entity Beans
你可以在一下的情况下使用实体bean:
l Bean代表一个商业实体,而不是一个过程。比如,CreditCardEJB应为一个实体bean,但CreditCardVerifierEJB应为一个会话bean。
l Bean的状态必需是持久的。如果bean的实例终止或者J2EE服务器停止后,bean的状态仍然保存在持久性存储器中(数据库)。
4什么是消息驱动Bean(Message-Driven Bean)?
注意:这个章节联系到Java 消息服务教程(The Java Message Service Tutorial)。因为消息驱动Bean依赖于Java消息服务(JMS)技术。为了更好的了解Message-Driven Bean,你可以参考一下下面教程URL:http://java.sun.com/products/jms/tutorial/index.html。
消息驱动Bean 是允许J2EE服务器异步处理消息的企业级Bean。它扮演着JMS信息监听者的角色,就像一个事件监听器,只不过是接收事件替换成接收信息。这些信息来 来自于一些J2EE组件,比如一个应用客户端,其他的企业级Bean,一个web组件,或者一个没有使用J2EE技术的JMS应用,JMS系统。
消息驱动Bean当前只处理JMS消息,也许将来它能够处理其他类型的消息。
实例请参看第7章节。
4.1消息驱动Bean和会话Bean,实体Bean有什么不同?
消息驱动Bean和会话Bean,实体Bean最大的不同在于在客户端消息驱动Bean不用通过接口来访问。接口在章节“接口定义客户端访问”中有描述过。和会话Bean,实体Bean不一样的是,消息驱动Bean仅有一个bean class。
由几个方面考虑,消息驱动Bean类似于一个无状态类型会话Bean。
l 消息驱动Bean的实例不为任何客户端保存数据或会话状态。
l 所有的消息驱动Bean的实例都是平等的,允许EJB容器指派一个消息到任何一个实例中。容器把这些实例形成一个池,使得消息流能够马上被处理掉。
l 一个消息驱动Bean能够处理多个客户端的消息。
消息驱动Bean实例的变量通过操作客户端的消息能够存储一些状态。比如,一个JMS API连接,一个开放数据库的连接,或者一个实体被引用到一个企业Bean实体。
当一个消息到达,容器调用消息驱动Bean 的onMessage方法来处理消息。onMessage方法一般把消息映射为五种JMS消息中的一个,并且控制它与应用的企业逻辑保持一致。 onMessage方法调用辅助方法,或者可以调用一个会话Bean,一个实体Bean,来处理这些消息中的信息,或者保存到数据库中。
在事务处理的前后,一条消息可能被转换过,因此onMessage方法中的操作都是一个独立的事务处理。如果消息处理被回滚了,那么消息也将回复回原来的样子。更多的信息,请参看第7章。
4.2什么时候使用消息驱动Bean。
会话Bean和实体Bean允许你发送信息,同步接收信息,但不允许异步接收信息。为了避免绑定到多个信息源,你也许更喜欢在不在服务器端组件中使用同步阻塞。为了异步接收信息,使用消息驱动Bean吧。
5.Enterprise Bean的内容
开发一个企业Bean,你必须提供以下的文件:
l 部署描述: 一个XML文件包含部署的信息,比如它的一致性类型和事务处理的属性。使用部署工具可以通过它新Enterprise Bean向导来有效地生成一个部署说明。
l Enterprise Bean类: 实现接口定义的方法。
l 接口: 远程访问,需要远程和本地接口。本地访问,需要本地和本地的接口。请参看“定义客户端访问接口”章节。(注意这些接口都没有被消息驱动Bean使用)
l 辅助类: 企业Bean需要一些其他的类,比如异常和实用类。
你把上面所说的文件打包为EJB JAR文件。EJB JAR是存储企业Bean的模型,它是独立的,可以被用到不同的应用中去。为了构建成一个应用,你必须打包一个或多个模型(比如EJB JAR文件)到EAR文件中去。EAR是一个应用的文档文件。当你部署包含EJB JAR文件的EAT文件时,你也就是把企业Bean部署到J2EE服务器上。
6.Enterprise Bean命名习惯
因为企业Bean由多个部分构成,他们经常遵循下面的命名习惯。表3-2汇集了这个教程里的一些命名习惯。
Table 3-2 Naming Conventions for Enterprise Beans
|
Item |
Syntax |
Example |
|
Enterprise bean name(DD) |
|
AccountEJB |
|
EJB JAR display name(DD) |
|
AccountJAR |
|
Enterprise bean class |
|
AccountBean |
|
Home interface |
|
AccountHome |
|
Remote interface |
|
Account |
|
Local home interface |
Local |
LocalAccountHome |
|
Local interface |
Local |
LocalAccount |
|
Abstract schema |
|
Account |
DD表示这一项是部署说明中的元素。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/374079/viewspace-131554/ ,如需转载,请注明出处,否则将追究法律责任。