UML 到 EJB 的转换把统一建模语言(UML)模型元素转换为企业 bean 和 Java 代码。UML 到 EJB 的转换与 UML 到 Java 的转换相同,但是前者还可以根据 EJB 转换概要文件中标记为构造型的 UML 元素生成企业 bean。
在使用 UML 到 EJB 的转换之前,应先熟悉 UML 到 Java 的转换。
支持处理 UML 元素与可视化企业 bean 或 Java 类之间的关系
您可以从“模型浏览器”视图中选择一项或多项作为 UML 到 EJB 转换的源。下表列出了转换接受作为有效源的项:
源 |
结果 |
UML 模型 |
转换模型中的所有包、类和接口 |
UML 包 |
转换包以及该包中的所有类和接口 |
UML 类 |
转换类及该类中的所有属性、操作、类和接口 注意:类的父代必须为 UML 包 |
UML 接口 |
转换接口及该接口中的所有属性、操作、类和接口 注意:接口的父代必须为 UML 包 |
UML 枚举 |
转换枚举及所有的枚举字面值 注意:枚举的父代必须为 UML 包 |
要从源模型生成企业 Bean,必须将 EJB 转换概要文件应用于该源模型,并且必须用 EJB 转换概要文件中的构造型对模型元素作出标记。
UML 到 EJB 的转换接受单个 EJB 项目以作为其目标。无论是否有客户端项目,您都可以创建 EJB 项目。转换会将它在 EJB 项目(通常为 EJB 模块)中检测到的第一个源文件夹以及在客户机项目(如果存在客户机项目,通常为 src)中检测到的第一个源文件夹中生成代码。
与 EJB 项目关联的 EJB 容器的版本会对 UML 到 EJB 的转换产生影响。 每个版本的 EJB 容器具有不同的规则,必须遵循这些规则,这样 UML 到 EJB 的转换才能正常运行和处理。下表列出了与不同版本的 EJB 容器相关的规则:
EJB 容器版本 |
影响转换的规则 |
2.1 |
必须仅使用远程接口生成容器管理的持久性(CMP)1.1 Bean |
2.0 |
必须仅使用远程接口生成 CMP 1.1 Bean |
1.1 |
|
如果在您运行转换之前没有遵循上述规则,则 EJB 转换不会处理源模型,也不会转换任何对象。
EJB 转换概要文件定义了一些构造型,UML 到 EJB 的转换将解释这些构造型以生成企业 bean。 下表列出了 EJB 转换概要文件定义的构造型:
构造型 |
目标元素 |
UML 到 EJB 的转换的解释 |
<<entity>> |
UML 类 |
代表实体 Bean |
<<service>> |
UML 类 |
用构造型属性 hasState 代表会话 bean,该属性最初设置为 false,这表示该会话 bean 无状态。 |
<<messageprocessor>> |
UML 类 |
代表消息驱动的 Bean |
<<id>> |
UML 属性 |
代表将要作为实体 Bean 的主键的一部分使用的 CMP 或 BMP 字段 |
<<query>> |
UML 操作 |
代表实体 Bean 上的查询方法 |
EJB 转换概要文件还定义了以下约束:
在使用 EJB 转换概要文件对模型进行验证时,如发现违反这些约束,则将生成警告。在运行 UML 到 EJB 的转换之前,应先更正引起这些警告的问题。 但是,这些警告并不会阻止您运行转换。
EJB 转换配置窗口包含六个选项卡:目标、实体、会话、高级、映射和通用。此部分描述了头三个选项卡是如何影响 EJB 转换的。
您可以使用目标选项卡来选择目标 EJB 项目,EJB 转换在该目标 EJB 项目中生成输出文件。即使是在 EJB 项目可用时,您也可以创建新的目标容器。每个项目与单个 EJB 容器相关。EJB 转换支持 EJB 项目向导提供的所有可用 EJB 容器版本。
目标 EJB 项目容器的版本可能限制了在实体和会话选项卡上的可用选项。关于每种类型的 EJB 容器的限制的更多信息,请参阅目标 EJB 容器部分。
您可以使用实体选项卡定制新生成的实体 Bean。您可以在实体选项卡上配置两个不同的选项:实体 bean 类型和实体 bean 接口。下图显示了 EJB 转换配置窗口中的实体选项卡:
根据项目中的 EJB 容器的版本,您在运行 EJB 转换之前,只能选择特定的属性组合。下表列出了转换支持的实体 Bean 类型、实体 Bean 支持的接口和缺省的接口选择:
EJB 容器版本 |
实体 Bean 类型 |
实体 Bean 支持的接口 |
缺省选择 |
2.x |
CMP 2.x |
本地和远程 |
仅本地接口 |
2.x |
CMP 1.1 |
远程 |
仅远程接口 |
2.x |
BMP |
本地和远程 |
仅本地接口 |
1.1 |
CMP 2.x |
无 |
不适用 |
1.1 |
CMP 1.1 |
远程 |
仅远程接口 |
1.1 |
BMP |
远程 |
仅远程接口 |
表中的缺省选择反映了实体 Bean 创建向导的缺省行为。
如果您选择了无效的选项组合,则 EJB 转换配置窗口的顶部就会显示错误消息,并且用于运行转换的运行按钮不可用。在选择了有效的选项组合之后,运行按钮将变为可用,且错误消息消失。
您可以使用会话选项卡为新生成的会话 Bean 定制接口的生成。下图显示了 EJB 转换配置窗口中的会话选项卡:
根据项目中的 EJB 容器的版本,您在运行 EJB 转换之前,只能选择特定的属性组合。根据 EJB 容器的版本,下表列出了转换支持的会话 Bean 接口,以及缺省的接口选择:
EJB 容器版本 |
会话 Bean 支持的接口 |
缺省选择 |
1.1 |
远程 |
仅远程接口 |
2.0 |
本地和远程 |
仅远程接口 |
2.1 |
本地和远程 |
仅远程接口 |
如果您选择了无效的选项组合,则 EJB 转换配置窗口的顶部就会显示错误消息,并且用于运行转换的运行按钮不可用。在选择了有效的选项组合之后,运行按钮将变为可用,且错误消息消失。
关于高级选项卡的信息,请参阅文档 UML 到 Java 的转换。
此部分描述 UML 到 EJB 的转换如何解释 UML 模型中的元素以及转换将什么内容生成为输出。
UML 到 EJB 的转换以与 UML 到 Java 的转换相同的方法解释基本类型。有关更多信息,请参阅文档 UML 到 Java 的转换。
UML 到 EJB 的转换以与 UML 到 Java 的转换相同的方法解释包:它将这些包转换为 Java 包。有关更多信息,请参阅文档 UML 到 Java 的转换。
UML 到 EJB 的转换以与 UML 到 Java 的转换相同的方法解释未标记的类:它将这些未标记的类转换为 Java 类。有关更多信息,请参阅文档 UML 到 Java 的转换。
如果未标记的类包含属性,其类型是具有构造型 <<entity>>、<<service>> 或 <<messageprocessor>> 的类,则转换不生成这些属性。而是转换将消息写入说明不转换源属性的日志文件中。
UML 到 EJB 转换以与 UML 到 Java 转换相同的方法解释未标记的接口:它将这些未标记的接口转换为 Java 接口。有关更多信息,请参阅文档 UML 到 Java 的转换。
如果未标记的接口包含属性,其类型属于具有构造型 <<entity>>、<<service>> 或 <<messageprocessor>> 的类,则转换不生成这些属性。而是转换将消息写入说明不转换源属性的日志文件中。
UML 到 EJB 转换以与 UML 到 Java 转换相同的方法解释未标记的枚举:它将这些未标记的枚举转换为 Java 接口。有关更多信息,请参阅文档 UML 到 Java 的转换。
UML 到 EJB 的转换将用 <<entity>> 构造型标记的类转换成 Bean 名称与源 UML 类名相同的 CMP 2.x、CMP 1.1 或 BMP 实体 Bean。生成的实体 Bean 的类型对应于您在 EJB 转换配置窗口中的实体选项卡上选择的选项。
转换总是为实体 Bean 生成以下 Java 类:
在实体选项卡上单击仅远程接口时,转换生成以下 Java 类:
在实体选项卡上单击仅本地接口时,转换生成以下 Java 类:
在实体选项卡上单击本地和远程接口时,转换生成以下 Java 类:
转换在为源 UML 类的父包生成的包文件夹中生成所有类。如果您创建 UML 模型而没有包,则转换会生成名为 ejbs 的缺省包。
转换在目标 EJB 项目的源树中生成 Bean 类和键类文件。
转换在目标 EJB 项目的客户端项目的源树中生成 4 个接口文件。如果不存在客户端项目,则转换在目标 EJB 项目中生成接口文件。
转换将定义实体 bean 的数据添加到部署描述符(ejb-jar.xml)。
泛化关系
如果实体 Bean 的源 UML 类与构造型 <<entity>> 的另一个 UML 类存在泛化关系(例如:扩展关系),则类表示的实体 Bean 就成为要生成的实体 Bean 的 EJB 超类。
这两个实体 Bean 必须具有相同的类型。因此,这两个实体 Bean 必须都是 CMP 2.x、CMP 1.1 或 BMP。例如:如果超级 Bean 是 CMP 2.x 实体 Bean,所有子代 Bean 就必须是 CMP 2.x 实体 Bean。如果超级 Bean 的类型与期望的子代 Bean 的类型不同,转换就会生成子代 Bean,而不带泛化关系。
实现关系
如果实体 Bean 的源 UML 类与接口元素存在实现关系(例如:实施关系),则源接口代表的接口将由 4 个接口(远程接口、主接口、本地接口和本地主接口)实施。
未标记的属性 - CMP 2.x
转换将源 UML 类上的属性转换成实体 Bean 上的 CMP 字段,且具有下表所列的属性:
CMP 2.x 字段属性 |
CMP 字段值 |
名称 |
UML 属性名称,字段名的首字符变为小写 |
类型 |
通过属性类型确定的类型(请参阅类型映射表)。 |
关键字段 |
False |
在 Bean 实施类中生成字段 |
False |
生成 getter 方法和 setter 方法 |
True |
将 getter 方法和 setter 方法提升为本地接口 |
True(如果本地接口存在) |
将 getter 方法和 setter 方法提升为远程接口 |
True(如果远程接口存在) |
IsArray |
如果 UML 属性具有有限的上限值,则为 True |
如果属性类型是另一个 CMP 2.x 实体 Bean 的属性类型,则转换不将属性转换为 CMP 字段,但假定此属性是应转换为 EJB 关系的关联的一部分。 但是,如果属性类型是另一个非 CMP 2.x 实体 Bean 的企业 Bean 的属性类型,则转换不会将属性转换为 CMP 字段或关联。而是转换将消息写入说明不转换源属性的日志文件中。
未标记的属性 - CMP 1.1
转换将源 UML 类上的属性转换成实体 Bean 上的 CMP 字段,且具有下表所列的属性:
CMP 1.1 字段属性 |
CMP 字段值 |
名称 |
UML 属性名称,字段名的首字符变为小写 |
类型 |
通过属性类型确定的类型(请参阅类型映射表)。 |
关键字段 |
False |
在 Bean 实施类中生成字段 |
False |
生成 getter 方法和 setter 方法 |
True |
将 getter 方法和 setter 方法提升为本地接口 |
False |
将 getter 方法和 setter 方法提升为远程接口 |
True(始终) |
IsArray |
如果 UML 属性具有有限的上限值,则为 True |
如果属性类型是另一个实体 Bean 或企业 Bean 的属性类型,则转换不将属性转换成 CMP 字段或关联。 而是转换将消息写入说明不转换源属性的日志文件中。
未标记的属性 - BMP
转换将源 UML 类上的属性转换成实体 Bean 上的 BMP 字段,且具有下表所列的属性:
BMP 字段属性 |
BMP 字段值 |
名称 |
UML 属性名称,字段名的首字符变为小写 |
类型 |
通过属性类型确定的类型(请参阅类型映射表)。 |
关键字段 |
False |
在 Bean 实施类中生成字段 |
True |
生成 getter 方法和 setter 方法 |
True |
将 getter 方法和 setter 方法提升为本地接口 |
True(如果本地接口存在) |
将 getter 方法和 setter 方法提升为远程接口 |
True(如果远程接口存在) |
IsArray |
如果 UML 属性具有有限的上限值,则为 True |
如果属性类型是另一个实体 Bean 或 EJB 的属性类型,则转换不将属性转换成 BMP 字段或关联。 而是转换将消息写入说明不转换源属性的日志文件中。
<<id>> 属性 - CMP 2.x 和 CMP 1.1
转换也将标记有 <<id>> 属性的源 UML 类上的属性转换为 CMP 字段,但属性值不同,如下表所列出的那样。这些 CMP 字段帮助形成主键。
CMP 2.x 和 CMP 1.1 字段属性 |
CMP 字段值 |
名称 |
UML 属性名称,字段名的首字符变为小写 |
类型 |
通过属性类型确定的类型(请参阅类型映射表)。 |
关键字段 |
True |
在 Bean 实施类中生成字段 |
False |
生成 getter 方法和 setter 方法 |
True |
将 getter 方法和 setter 方法提升为本地接口 |
False |
将 getter 方法和 setter 方法提升为远程接口 |
False |
IsArray |
如果 UML 属性具有有限的上限值,则为 True |
如果属性类型是另一个实体 Bean 或企业 Bean 的属性类型,则转换不将属性转换成 CMP 关键字段或关联。 而是转换将消息写入说明不转换源属性的日志文件中。
<<id>> 属性 - BMP
转换也将标记有 <<id>> 的源 UML 类上的属性转换为 BMP 字段,但属性值不同,如下表所列出的那样。这些 BMP 字段帮助形成主键。
BMP 字段属性 |
BMP 字段值 |
名称 |
UML 属性名称,字段名的首字符变为小写 |
类型 |
通过属性类型确定的类型(请参阅类型映射表)。 |
关键字段 |
True |
在 Bean 实施类中生成字段 |
True |
生成 getter 方法和 setter 方法 |
True |
将 getter 方法和 setter 方法提升为本地接口 |
False |
将 getter 方法和 setter 方法提升为远程接口 |
False |
IsArray |
如果 UML 属性具有有限的上限值,则为 True |
如果属性类型是另一个实体 Bean 或企业 Bean 的属性类型,则转换不将属性转换成 BMP 关键字段或关联。 而是转换将消息写入说明不转换源属性的日志文件中。
如下表所说明,转换根据源属性类型生成具有相应类型的 CMP 和 BMP 字段:
UML 属性类型 |
CMP/BMP 字段类型 |
布尔型 |
布尔型 |
字节 |
字节 |
字符型 |
字符型 |
浮点型 |
浮点型 |
整型 |
整型 |
长整型 |
长整型 |
短整型 |
短整型 |
布尔型 |
java.lang.Boolean |
字节 |
java.lang.Byte |
字符型 |
java.lang.Char |
浮点型 |
java.lang.Float |
整型 |
java.lang.Integer |
长整型 |
java.lang.Long |
短整型 |
java.lang.Short |
字符串 |
java.lang.String |
其他 |
标准名称 |
未标记的操作
转换将源 UML 类上的未标记的操作转换成实体 Bean 上的业务方法。最初,转换该操作与转换未标记 UML 类上的操作相同。转换通过将方法名称的首字符变为小写(如果该字符为有效的大写字符)来强制进行小写命名。 经过某些修改的已转换操作被添加到下表列出的类中。
类 |
方法修改 |
Bean 类 |
无更改 |
本地接口 |
接口方法 |
远程接口 |
接口方法,抛出 java.rmi.RemoteException |
<<query>> 操作 - CMP 2.x
转换将源 UML 类上的 <<query>> 操作转换为以下两种查询方法中的一种:finder 方法和 select 方法。select 方法仅存在于 CMP 2.x 实体 Bean 中。
转换加以某些修改后,在下表中列出的类中生成 finder 方法:
类 |
方法修改 |
本地主接口 (如果本地接口存在) |
|
远程主接口 (如果远程接口存在) |
|
UML 操作名称 |
finder 方法名 |
xxx |
findXxx |
findXxx |
findXxx |
FindXxx |
findXxx |
Java 转换分析的返回类型 |
finder 方法返回类型 |
已映射的集合(如集合、列表、集等) |
java.util.Collection |
<源类名>[] |
java.util.Collection |
<源类名> 或空 |
|
<用户定义的类型名称>[] |
java.util.Collection |
<非源类名(例如:字符串、整型等)>[] |
java.util.Collection |
<用户定义的类型名称> |
生成 select 方法而不是 finder 方法 |
<非源类名(例如:字符串、整型等)> |
生成 select 方法而不是 finder 方法 |
EJB 转换创建一个任务,该任务指示您需要将查询手工添加到每个生成的 finder 方法的部署描述符中。
如果操作的可视性是私有的,或者如果返回类型不同于源 UML 类的名称且实体 Bean 类型为 CMP 2.x,则转换将查询操作转换成 select 方法。
操作可视性 |
返回类型 |
方法类型 |
私有 |
等于源类名 |
select 方法 |
非私有 |
等于源类名 |
finder 方法 |
私有 |
非源类名 |
select 方法 |
非私有 |
非源类名 |
select 方法 |
转换通过对以下各项进行修改,在 Bean 类中生成 select 方法:
UML 操作名称 |
Select 方法名称 |
xxx |
ejbSelectXxx |
selectXxx |
ejbSelectXxx |
SelectXxx |
ejbSelectXxx |
ejbSelectXxx |
ejbSelectXxx |
Java 转换分析的返回类型 |
select 方法返回类型 |
已映射的集合(如集合、列表、集等) |
集合类型的标准名称(例如:java.util.Collection) |
<源类名>[] |
java.util.Collection |
<源类名> 或空 |
本地接口名称 |
<用户定义的类型名称>[] |
java.util.Collection |
<非源类名(例如:字符串、整型等)>[] |
java.util.Collection |
<用户定义的类型名称> |
用户定义的类型名称 |
<非源类名(例如:字符串、整型等)> |
非源类名 |
EJB 转换创建一个任务,该任务指示您需要将查询手工添加到每个生成的 select 方法的部署描述符中。
<<query>> 操作 - CMP 1.1
转换将源 UML 类上的 <<query>> 操作转换为一种查询方法:finder 方法。CMP 1.1 实体 Bean 不支持 select 方法,因为这些方法仅可用于 CMP 2.x 实体 Bean。因此,无论 <<query>> 操作的返回类型和可视性如何,转换总是在实体 Bean 的远程主接口中生成 finder 方法。
如下表所说明的,转换加以某些修改后,总是在远程主接口中生成 finder 方法:
类 |
方法修改 |
远程主接口 |
|
UML 操作名称 |
finder 方法名 |
xxx |
findXxx |
findXxx |
findXxx |
FindXxx |
findXxx |
Java 转换分析的返回类型 |
finder 方法返回类型 |
已映射的集合(如集合、列表、集等) |
java.util.Collection |
<源类名>[] |
java.util.Collection |
<源类名> 或空 |
远程接口名称 |
<用户定义的类型名称>[] |
java.util.Collection |
<非源类名(例如:字符串、整型等)>[] |
java.util.Collection |
<用户定义的类型名称> |
远程接口名称 |
<非源类名(例如:字符串、整型等)> |
远程接口名称 |
EJB 转换创建一个任务,该任务指示您需要将查询手工添加到每个生成的 finder 方法的部署描述符中。
<<query>> 操作 - BMP
转换将源 UML 类上的 <<query>> 操作转换为一种查询方法:finder 方法。任何版本的 BMP 实体 Bean 都不支持 select 方法,因为这些方法仅可用于 CMP 2.x 实体 Bean。因此,无论 <<query>> 操作的返回类型和可视性如何,转换总是在 Bean 实施类中生成 finder 方法。然后,转换在实体 Bean 的现有接口中生成 finder 方法。
如下表所说明的,转换加以某些修改后,在以下类中生成 finder 方法:
类 |
方法修改 |
本地主接口 |
|
远程主接口 (如果远程接口存在) |
|
Bean 实施类 |
|
UML 操作名称 |
finder 方法名 |
xxx |
findXxx |
findXxx |
findXxx |
FindXxx |
findXxx |
ejbFindXxx |
findEjbFindXxx |
EjbFindXxx |
findEjbFindXxx |
UML 操作名称 |
finder 方法名 |
xxx |
ejbFindXxx |
findXxx |
ejbFindXxx |
FindXxx |
ejbFindXxx |
ejbFindXxx |
ejbFindEjbFindXxx |
EjbFindXxx |
ejbFindEjbFindXxx |
Java 转换分析的返回类型 |
finder 方法返回类型 |
已映射的集合(如集合、列表、集等) |
java.util.Collection |
<源类名>[] |
java.util.Collection |
<源类名> 或空 |
|
<用户定义的类型名称>[] |
java.util.Collection |
<非源类名(例如:字符串、整型等)>[] |
java.util.Collection |
<用户定义的类型名称> |
|
<非源类名(例如:字符串、整型等)> |
|
Java 转换分析的返回类型 |
finder 方法返回类型 |
已映射的集合(如集合、列表、集等) |
java.util.Collection |
<类名>[] |
java.util.Collection |
<类名> 或空 |
键类名称 |
内部类
忽略。
内部接口
忽略。
UML 到 EJB 的转换将具有构造型 <<service>> 的类转换为容器管理的、无状态的或有状态的会话 Bean(该会话 Bean 的 Bean 名称与源 UML 类的名称相同)。转换始终为会话 Bean 生成以下 Java 类:
在会话选项卡上单击仅远程接口时,转换生成以下 Java 类:
在会话选项卡上单击仅本地接口时,转换生成以下 Java 类:
在会话选项卡上单击本地和远程接口时,转换生成以下 Java 类:
转换在为源 UML 类的父包生成的包文件夹中生成所有类。如果创建 UML 模型而没有包,则转换会创建名为 ejbs 的缺省包。
转换在目标 EJB 项目的源树中生成 Bean 类文件。
转换在目标 EJB 项目的客户端项目的源树中生成 4 个接口文件。如果不存在客户端项目,则转换在目标 EJB 项目中生成接口文件。
转换将定义会话 bean 的数据添加到部署描述符(ejb-jar.xml)中。
构造型属性 - hasState
每个具有构造型 <<service>> 的 UML 类都具有名为 hasState 的构造型属性。当 hasState 的值为 false 时,转换将该 UML 类生成为无状态会话 Bean。相反,当 hasState 的值为 true 时,转换将 UML 类生成为有状态会话 Bean。
注:构造型属性仅影响那些被转换生成为新会话 Bean 的 UML 类。
在缺省情况下,hasState 属性的值为 false(该值与会话 Bean 创建向导中的缺省设置一致)。
泛化关系
如果会话 Bean 的源 UML 类与具有构造型 <<service>> 的另一个 UML 类存在泛化关系(例如扩展关系),并且该构造型具有相同的 hasState 属性值,则该类代表的会话 Bean 就成为要生成的会话 Bean 的 EJB 超类。
实现关系
如果会话 Bean 的源 UML 类与接口元素有实现关系(例如实施关系),则源接口代表的接口由 4 个接口(远程接口、主接口、本地接口和本地主接口)实施。
属性
转换将源 UML 类上的属性转换成 Bean 类中的 Java 属性。 有关如何转换属性的更多信息,请参阅文档 UML 到 Java 的转换。转换通过将属性名的首字符变为小写(如果该字符为有效的大写字符)来强制进行小写命名。
如果属性的类型是另一个企业 Bean,则 EJB 转换不会为会话 Bean 生成字段和关联。而是转换将消息写入说明不转换源属性的日志文件中。
操作
转换将源 UML 类上的操作转换成会话 Bean 上的业务方法。最初,转换该操作与转换未标记 UML 类上的操作相同。转换通过将方法名称的首字符变为小写(如果该字符为有效的大写字符)来强制进行小写命名。 经过某些修改的已转换操作被添加到下表列出的类中。
类 |
方法修改 |
Bean 类 |
无更改 |
本地接口 |
接口方法 |
远程接口 |
接口方法,抛出 java.rmi.RemoteException |
根据操作参数,转换使用以下规则来确定操作返回类型:
o 操作具有返回和输出参数
o 操作具有多个输出参数
内部类
忽略。
内部接口
忽略。
UML 到 EJB 的转换将具有构造型 <<messageprocessor>> 的类转换为消息驱动的 Bean,该消息驱动的 Bean 具有与源 UML 类名相同的 Bean 名称并且具有缺省数据。转换生成以下 Java 类:
转换在为源 UML 类的父包生成的包文件夹中生成类。如果创建 UML 模型而没有包,则转换会创建名为 ejbs 的缺省包。
转换在目标 EJB 项目的源树中生成 Bean 类文件。
转换将定义消息驱动 bean 的数据添加到部署描述符(ejb_jar.xml)中。
泛化关系
如果消息驱动的 Bean 的源 UML 类与具有构造型 <<messageprocessor>> 的另一个 UML 类存在泛化关系(例如:扩展关系),则类表示的消息驱动的 Bean 成为要生成的实体 Bean 的 EJB 超类。
实现关系
忽略。
属性
转换将源 UML 类上的属性转换成 Bean 类中的 Java 属性。 有关如何转换属性的更多信息,请参阅文档 UML 到 Java 的转换。如果属性的类型是另一个企业 Bean,则 EJB 转换不会为会话 Bean 生成字段和关联。而是转换将消息写入说明不转换源属性的日志文件中。
操作
转换将源 UML 类上的操作转换为典型的 Java 方法,就如同消息驱动的 Bean 是 Java 类一样。
内部类
忽略。
内部接口
忽略。
通常,转换以与 UML 到 Java 转换相同的方法来转换关联:它将端点属性转换为 Java 属性。
如果关联的端点是具有构造型 <<entity>>、<<service>> 或 <<messageprocessor>> 的类,则转换不会转换该端点。而是转换会在元数据目录中的日志文件内写入声称端点属性未被转换的消息。但以下情况例外:关联在两个具有构造型 <<entity>> 的类之间,并且这两个类都生成为 CMP 2.x Bean。然后,转换将 UML 关联转换为 EJB 2.0 关系(也称为容器管理的关系(CMR))。下表说明了关联属性和 EJB 关系属性之间的映射:
关联属性 |
EJB 关系属性 |
End1 |
BeanA |
End2 |
BeanB |
End1 名称 |
BeanB CMR 名称 |
End2 名称 |
BeanA CMR 名称 |
End1 可导航性 |
BeanB 可导航性 |
End2 可导航性 |
BeanA 可导航性 |
|
|
|
|
下图说明了两个具有构造型 <<entity>> 的 UML 类。如果转换将两个实体类都生成为 CMP 2.x 实体 Bean,则这两个类之间的关联就生成为 CMR。
转换发生后,部署描述符中就有了一个描述 AEntity 和 BEntity 之间的 CMR 的条目。 如下图所示,项目的部署描述符可以显示两个 CMP 2.x 实体 Bean 之间的关联:
下表列出了转换如何对具有构造型 <<entity>>、<<service>> 或 <<messageprocessor>> 的类转换依赖关系和生成 EJB 引用。
UML 依赖关系源 |
UML 依赖关系目标 |
EJB 目标 |
<<entity>> 类 |
<<entity>> 类 |
EJB 引用 |
<<entity>> 类 |
<<service>> 类 |
EJB 引用 |
<<messageprocessor>> 类 |
<<entity>> 类 |
EJB 引用 |
<<messageprocessor>> 类 |
<<service>> 类 |
EJB 引用 |
<<service>> 类 |
<<entity>> 类 |
EJB 引用 |
<<service>> 类 |
<<service>> 类 |
EJB 引用 |
当目标 Java 2 Platform, Enterprise Edition(J2EE)项目至少有一个 Bean 与正在转换的 UML 类具有相同的名称和名称空间时,就可能会发生重新应用场景。重新应用场景指这样一种情况:现有企业 Bean 的类型与将要为 UML 模型中的相应类生成的企业 Bean 的类型相匹配。
当要生成的企业 Bean 的类型与现有的企业 Bean 的类型不兼容时,就会发生冲突场景。在冲突场景中,UML 到 EJB 的转换不更新现有的 Bean,也不生成新的企业 Bean。
下表列出了对于可能发生的重新应用,CMP 2.x 实体 Bean 转换的预期响应:
要生成的企业 Bean |
现有的企业 Bean |
预期场景 |
转换响应 |
CMP 2.x |
CMP 2.x |
重新应用 |
更新 CMP 字段和方法 |
CMP 2.x |
CMP 1.1 |
重新应用 |
更新 CMP 字段和方法(如同常规的 CMP 1.1 到 CMP 1.1 重新应用场景一样 |
CMP 2.x |
BMP |
重新应用 |
更新 BMP 字段和方法(如同常规的 BMP 到 BMP 重新应用场景一样) |
CMP 2.x |
会话(有状态或无状态) |
冲突 |
保留会话 Bean 不动 |
CMP 2.x |
消息驱动 |
冲突 |
保留消息驱动的 Bean 不动 |
下表列出了对可能发生的重新应用,CMP 1.1 实体 Bean 转换的预期响应:
要生成的企业 Bean |
现有的企业 Bean |
预期场景 |
转换响应 |
CMP 1.1 |
CMP 2.x |
重新应用 |
更新 CMP 字段和方法(如同它是正常的 CMP 2.x 到 CMP 2.x 重新应用场景一样) |
CMP 1.1 |
CMP 1.1 |
重新应用 |
更新 CMP 字段和方法 |
CMP 1.1 |
BMP |
重新应用 |
更新 BMP 字段、方法和关联(如同常规的 BMP 到 BMP 重新应用场景一样) |
CMP 1.1 |
会话(有状态或无状态) |
冲突 |
保留会话 Bean 不动 |
CMP 1.1 |
消息驱动 |
冲突 |
保留消息驱动的 Bean 不动 |
下表列出了对可能发生的重新应用,BMP 实体 Bean 转换的预期响应:
要生成的企业 Bean |
现有的企业 Bean |
预期场景 |
转换响应 |
BMP |
CMP 2.x |
重新应用 |
更新 CMP 字段和方法(如同它是正常的 CMP 2.x 到 CMP 2.x 重新应用场景一样) |
BMP |
CMP 1.1 |
重新应用 |
更新 CMP 字段和方法(如同常规的 CMP 1.1 到 CMP 1.1 重新应用场景一样) |
BMP |
BMP |
重新应用 |
更新 BMP 字段和方法 |
BMP |
会话(有状态或无状态) |
冲突 |
保留会话 Bean 不动 |
BMP |
消息驱动 |
冲突 |
保留消息驱动的 Bean 不动 |
下表列出了对可能发生的重新应用,会话 Bean 转换的预期响应:
要生成的企业 Bean |
现有的企业 Bean |
预期场景 |
转换响应 |
会话(有状态或无状态) |
CMP 2.x |
冲突 |
保留 CMP 2.x Bean 不动 |
会话(有状态或无状态) |
CMP 1.1 |
冲突 |
保留 CMP 1.1 Bean 不动 |
会话(有状态或无状态) |
BMP |
|
保留 BMP Bean 不动 |
会话(有状态) |
会话 (仅为有状态) |
重新应用 |
更新会话 Bean 的字段和方法 |
会话(有状态) |
会话 (仅为无状态) |
冲突 |
保留无状态会话 Bean 不动 |
会话(无状态) |
会话 (仅为有状态) |
冲突 |
保留有状态会话 Bean 不动 |
会话(无状态) |
会话 (仅为无状态) |
重新应用 |
更新会话 Bean 的字段和方法 |
会话(有状态或无状态) |
消息驱动 |
冲突 |
保留消息驱动的 Bean 不动 |
下表列出了对可能发生的重新应用,消息驱动的 Bean 转换的预期响应:
要生成的企业 Bean |
现有的企业 Bean |
预期场景 |
转换响应 |
消息驱动 |
CMP 2.x |
冲突 |
保留消息驱动的 Bean 不动 |
消息驱动 |
CMP 1.1 |
冲突 |
保留消息驱动的 Bean 不动 |
消息驱动 |
BMP |
冲突 |
保留消息驱动的 Bean 不动 |
消息驱动 |
会话(有状态或无状态) |
冲突 |
保留消息驱动的 Bean 不动 |
消息驱动 |
消息驱动 |
重新应用 |
更新消息驱动的 Bean 的字段和方法 |
下表列出了对可能发生的重新应用,未标记的 UML 类转换的预期响应:
UML 类上的构造型 |
现有的企业 Bean |
预期场景 |
转换响应 |
未标记 |
CMP 2.x |
重新应用 |
在 CMP 2.x 实体 Bean 的现有远程接口中更新 CMP 2.x 实体 Bean 的字段和方法 |
未标记 |
CMP 1.1 |
重新应用 |
在 CMP 1.1 实体 Bean 的现有远程接口中更新 CMP 1.1 实体 Bean 的字段和方法 |
未标记 |
BMP |
重新应用 |
在 BMP 实体 Bean 的现有远程接口中更新 BMP 实体 Bean 的字段和方法 |
未标记 |
会话(有状态或无状态) |
重新应用 |
在会话的现有远程接口中更新会话的字段和方法 |
未标记 |
消息驱动 |
重新应用 |
生成典型的 Java 类 |
在未标记的 UML 类的重新应用场景中,对现有企业 Bean 的远程接口的代码进行更新会导致 EJB 项目中出现构建错误。发生这些构建错误是由于远程接口中的更新代码不符合远程接口的 EJB 规范。如果您打算覆盖整个企业 Bean,就必须在运行 EJB 转换之前除去现有的企业 Bean。
此部分更详细地讨论了转换如何对重新应用场景作出响应,并提供了关于在重新应用后可从转换中预期什么的更多信息。
如果对 CMP 2.x 实体 Bean 进行重新应用,则可能会发生以下修改:
不应进行以下修改:
如果对 CMP 1.1 实体 Bean 进行重新应用,则可能会发生以下修改:
不应进行以下修改:
如果对 BMP 实体 Bean 进行重新应用,则可能会发生以下修改:
不应进行以下修改:
如果对会话 Bean 进行重新应用,则可能会发生以下修改:
不应进行以下修改:
如果对消息驱动的 Bean 进行重新应用,则可能会发生以下修改:
不应进行以下修改:
下表列出了 UML 到 EJB 的转换如何处理各种关系:
UML 源元素 |
可视化的目标元素 |
关系类型 |
转换结果 |
具有构造型 <<entity>> 或 <<service>> 的类 |
Java 接口(UML 接口) |
实施 |
生成的企业 Bean 实施可视化接口 |
具有构造型 <<entity>> 或 <<service>> 的类 |
Java 接口(UML 接口) |
实现 |
生成的企业 Bean 实施可视化接口 |
具有构造型 <<entity>> 的类 |
可视化的实体 Bean(UML 组件) |
关联 |
CMR 关系 |
具有构造型 <<entity >>、<<service>> 或 <<messageprocessor>> 的类 |
可视化的实体 Bean 或会话 Bean(UML 组件) |
依赖关系 |
EJB 引用 |
UML 到 EJB 的转换支持与团队功能集成。 当您对源控制的环境中的目标项目运行转换时,系统就会提示您向源控制添加新文件并检出现有文件。
UML 到 EJB 的转换提供的映射支持与 UML 到 Java 的转换提供的映射支持相似。关于如何设置并使用映射模型来运行转换的信息,请参阅文档 UML 到 Java 的转换。
当源类被标记要转换为企业 Bean 时,转换会使用源类的映射名称作为生成的企业 Bean 的 Bean 名称。
如果启用了生成“源-目标”关系功能,则转换会向生成的 Java 类和接口的 API 文档添加标记。这些标记包含了使工具能够跟踪生成的文件至原始 UML 源元素的信息。
对于生成的企业 Bean,转换为企业 Bean 生成的所有 Java 文件都使“源-目标”API 文档标记指向单个 UML 源类。
使用条款 | 反馈
(C) Copyright IBM Corporation 2005, 2005. All Rights Reserved.