EJB 数据介体服务编程注意事项
当您开始编写应用程序以使用产品中提供的 Enterprise JavaBeans (EJB) 数据介体服务 (DMS) 时,请考虑以下事项。
EJB 编程模型
EJB 数据介体服务只支持 EJB 编程模型的子集。
- 当使用 EJB 集合参数从 EJB 实例检索数据时,或者使用 applyChanges 更新 EJB 实例时:
- EJB DMS 使用企业 Bean 的本地接口。必须将容器管理的持久性 (CMP) 字段的 Getter 和 setter 调用以及查询表达式中使用的任何 EJB 方法转储到本地接口。
- 对于创建 EJB 的介体,必须存在 create 方法,它是将主键类用作唯一自变量的 EJB home 上定义的方法。如果不存在这样的方法,那么必须提供处理创建操作的适配器。同样,为 EJB 定义的 EJBLocalHome 接口必须包括(除了 create 方法之外)以下方法:
findByPrimaryKey(<key class>) remove (java.lang.Object) create (<key class>)
- 当直接为数据库调用 applyChanges 方法时,会发生以下影响:
- 不更新容器。应该尽可能通过事务终止以及使用适当的容器高速缓存选项强制进行刷新。
- 不维护 EJB 容器管理的关系 (CMR)。您必须依靠数据库 RI 来维护 Datagraph 中没有检索到的那些关系。
- CMP 字段必须是允许的类型。有关这些类型的列表,请参阅EJB 介体查询语法。
- 不支持使用 EJB 转换器/组合器用户定义的类型的 CMP 字段。
下表显示了 EJB 编程模型中 EJB DMS 不支持的限制。
直接从 db 检索 | 从 EJB 容器检索 | 直接更新 db | 通过 EJB 更新 | |
---|---|---|---|---|
EJB 持久性继承 | 否 | 否 | 否 | 否 |
EJB cmp 字段和 EJB 转换器 | 否 | 是 | 否 | 是 |
事务性
- 必须在事务作用域(用户事务或容器事务)内完成包括 create 在内的所有介体调用。一定不要在同一事务内调用不同的介体调用,包括 create、getGraph 和 applyChanges。实际上,最常见的情况是在单独的事务中完成调用。
访问意向
- 当介体查询使用 EJB 的抽象模式名称 (ASN) 来引用 EJB时,将直接从数据库中检索数据。数据源连接上使用的访问意向和隔离级别是在 EJB 动态查询访问意向的应用程序概要文件中指定的访问意向。因为打算在已断开连接的编程模型中使用 DataGraph,所以建议您为应用程序定义乐观访问意向。
- 当介体在使用 EJB 集合来检索数据时,如果 EJB 需要激活,那么将使用在应用程序概要文件中指定的访问意向。
- 在 applyChanges 期间,在对数据库应用更改之前,将使用乐观并发控制来验证 DataObject 中的某些字段。通常,是在检索事务之外的事务中处理更新的。因此,为了避免丢失更新,就需要验证另一个事务尚未更新数据。在定义 EJB 至 RDB 的映射时,可以指定一个或多个 EJB 字段作为乐观谓词。这些字段用于进行验证,即,将当前数据库值与 DataGraph 更改日志中的旧值进行比较。如果验证成功,那么会将这些字段的当前值写入数据库中。如果比较返回 false 并且更新失败,那么说明发生了异常。所有这些操作都是在添加了额外谓词的单个 UPDATE 语句中完成的,如以下示例所示。“乐观谓词”字段为 myColumn1。
update myTable set myColumn1="new value1", myColumn2="new value2"where myKey="key value" and myColumn1="old value1"
- 当通过 EJB 容器执行 applyChanges 时,企业 Bean 的当前值与乐观谓词字段原来的值比较。如果值不相等,那么会发生异常。
- 假定您已将一个或多个 EJB 字段定义为乐观谓词,那么为了使 SDO 可更新,那么必须至少将其中一个乐观谓词字段检索到数据对象中。否则,applyChanges 将返回异常。应该通过调用者或数据库触发器更新该字段;介体不会自动增加或设置该字段。
- 并不会验证所有字段,将只验证 EJB 至 RDB 映射中标记为乐观谓词的那些字段。
- 请注意,EJB 映射工具允许不存在乐观谓词字段。在这种情况下,将由介体执行更新,但是不会进行任何验证。
- 创建和删除操作不会利用乐观谓词字段。
- 当通过 EJB 实例应用更改时,可能必须首先激活 EJB。在此情况下,将应用与 EJB 方法相关联的适当访问意向。建议您在具有悲观访问意向的概要文件中运行 applyChanges,否则将调用两次乐观并发逻辑:将数据对象值复制到 EJB 时调用一次,持久性管理器将 EJB 字段值的先前值与数据库记录进行比较时会再次调用。
- 直接从数据库检索时介体使用的访问意向是为第一条查询语句中指定的 EJB 定义的缺省访问意向。
最佳实践
- 您可以调用一个实例上的 getGraph,更新返回的 DataGraph,然后调用其他介体实例上的 applyChanges。然而,当不需要同一介体实例时,那么需要相同的查询形式。查询形式是查询语句的号码和顺序、SELECT 和 FROM 子句中指定的字段和关系,等。
- 尽可能避免重复调用 createMediator。使用参数化查询并使用 getGraph 来传递不同的参数值。