WEB开发网
开发学院软件开发Java 使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发... 阅读

使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

 2010-07-02 00:00:00 来源:WEB开发网   
核心提示:本文介绍 Rational Software Architect(RSA)V7.5 中最新的 UML-to-JPA 转换,它允许使用者在 UML 对象模型上进行 JPA 配置和数据模型设计,使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发,并能快速生成带 JPA 注解的 Java 类,可以将开

本文介绍 Rational Software Architect(RSA)V7.5 中最新的 UML-to-JPA 转换,它允许使用者在 UML 对象模型上进行 JPA 配置和数据模型设计,并能快速生成带 JPA 注解的 Java 类,可以将开发人员从频繁的重复工作中解放出来。当在 O/R Mapping 开发过程中因需求变化而带来模型和代码的频繁变化时,使用 RSA 的 UML-to-JPA 转换工具可以有效的降低项目迭代中的重复工作,同时也有利于保证对象模型和数据模型的一致性,对于应用开发人员和设计人员都有着重要的现实意义。

本文主要面向 Java 持久化开发和设计人员,假定读者对 Java O/R Mapping 和 JPA 有基本的了解,您也可以参见参考资料以了解更多 JPA 和 Java 持久化相关的知识。本文将主要介绍使用 JPA Transformation 开发 JPA 应用。

准备工作

JPA 简介

持久化就一直是 Java 开发人员关心的话题,由于 EJB 的持久化过于重量级,产生了很多的 Java 持久化框架,O/R Mapping 可以将我们从繁重的数据库存储和对象序列化的工作中解放出来,并且使得开发人员可以灵活的应对需求的变化而带来的数据库的变化和对象模型的变化,能够减少维持此他们之间的映射的代码的变化。最新的 JPA 的规范更规定了 Java 持久化的标准 API 和配置方式,他同时支持注解和配置文件。在实际的使用过程中,我们体会到 JPA 功能的强大,同时也感受到一定程度的不方便。使用映射配置文件时,每次数据库或者对象模型的微小变化都需要重新修改配置文件,如果使用注解,虽然元素据和 Java 代码绑定,但是如果代码是由 UML 等模型转换过来,那么每次修改后重新转换,还需要重新增加 JPA 元素的注解。同时,注解是分散在每个 Java 类文件中的,缺乏一种有效的集中管理机制,修改和维护也不是很方便。因此如果能够从 UML 模型直接转换成 JPA 的注解,我们就可以在模型层次上一致的来管理 JPA 的元数据,很大程度上减少了开发人员的工作量。本文将着重介绍在 RSA7.5 中如何配置 JPA Transformation 的 profile 和 stereotype,将不详细介绍 JPA 注解本身以及 RSA 开发 JPA 的常规方法,读者如有需要,请参考相关资料。

JPA Transformation UML profile 简介

从 UML2.0 开始,UML 规范引入了一个非常重要的概念:UML profile (概要),它允许 UML 语言能被适配到特定的领域,用户可以自由的实现客户化的 UML profile,并基于这些 UML profile 的扩展能力创建特定的领域模型。UML profile 为独立于领域的 UML 提供了简单的扩展机制,它能够支持定义领域特定的实体和规则。最新版的 RSA7.5 版本中就内置了一些帮助我们开发和建模的 UML profile,其中包括我们本文使用到的 JPA Transformation profile。您可以参考“用于软件服务的 UML 2.0 profile”一文以了解更多在 RSA 中使用 UML profile 的用法。 profile 主要由 stereotype (构造型)组成,构造型定义哪个 UML 类(元类)与其关联、该类上的属性以及有关构造型元素如何与其他元素关联的约束。例如,在 RSA 中的 JPA Transformation profile 中,Entity 构造型扩展 Class UML 元类。它说明我们可以将一个 UML Class 声明为 JPA 这个领域内的一个实体。同样对于 Entity 类中的属性,profile 规定了我们可以对其应用的一些构造型如 ID,Column 等,通过对对象模型应用不同的构造型,并对这些构造型设置相应的属性值,JPA Transformation profile 允许我们完整的表达 JPA 的语义。配合 JPA Transformation 功能,用户可以将经过定制后的类图可以直接转化会带注解的 JPA Java 类,能够加速使用 JPA 作为持久层的开发过程,并使对象模型和持久化模型保持一致。

示例使用的 UML 模型

本文将采用图 1 中描述的对象模型为例来说明如何应用 RSA 中的 UML-to-JPA 转换功能来加速 JPA 的开发。

图 1. 示例用对象模型
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

这个简单的对象模型,主要用于描述超市的购物小票,其中 Invoice 表示小票对象,Customer 表示会员客户,每个小票可以关联到 1 个客户,如果有客户则表示会员(对应客户持有超市会员卡),或者没有客户。小票上打印的 InvoiceItem 可以是一般商品,商品折扣,或者会员积分。

以上模型完全为了本文说明问题而虚构的。假定现在需要实现以上模型的持久化,这符合 JPA 开发的正向映射的场景,是一个典型的自顶向下的开发模式。以持久化对象的模型作为开发的起点,经过配置和 JPA 的转换,生成带注解的 JPA 实体类,使用 JPA 配子文件和 API 完成实体持久化功能。如果使用如 Apcahe OpenJAP 这样的工具,开发过程如下:由 UML 对象模型转化生成 Java 类,给这些 Java 类写配置文件或者增加注解,在使用工具根据配置生成数据库,然后就可以使用 JPA 的 API 在运行时操作持久化对象。这个是典型的正向映射,如果模型是确定的,上述开发过程会比较顺利,只需要进行一次,也没有重复的劳动,也不会产生模型的不一致。但是,在现实的开发过程中,对象模型和数据库总是处于变化之中,在迭代的开发过程中,一旦需求发生变化,模型要变化,重新转化为 Java,然后配置文件或者注解要跟着变化,重新生成数据库,并且要保持模型和 Java 以及配置的一致性。如果您曾经从事类似的开发,就会深切的了解到这种重复的工作会给开发人员带来多大的负担。

IBM 最新的 RSA7.5 版本,为开发人员提供了一种先进的模型驱动开发的体验,通过 JPA Transformation profile 提供了可以扩展 UML 对象模型成为 JPA 配置模型的能力,允许开发人员和建模人员在 UML 类图级别进行 JPA 的配置,保证了对象模型和持久化配置的一致性,并通过自动化的转换可以直接快速的实现 JPA 的开发。您可以在下载资料中下载该模型的项目交换文件(SampleModel.zip),导入到 RSA7.5 的工作区中,按照本文的步骤尝试使用 JPA Transformation 的旅程。本文还提供了一个 JUNIT 测试用例来测试 JPA 的持久化 API。

为 UML 模型应用 JPA Transformation profile

在这一小节,您将了解到如何为 UML 对象模型配置的 JPA Transformation profile,限于篇幅,本文仅讨论一些常见的 JPA 注解如何在模型上使用 stereotype 配置,更多复杂的设置请参考相关文档。

为模型添加 profile 支持

为了使用 JPA Transformation 的 profile,我们需要首先为模型应用该 profile。您可以在 RSA 的项目浏览器中选中模型文件的 package,在右键菜单中的选择 UML Properties,打开 UML Properties 对话框来为模型添加 JPA Transformation 的 profile。在打开的“UML Properties”对话框中,点击右上角的图形按钮,如图 2,在弹出的“Select profile”对话框中选择 JPA Transformation,点击OK就使得该模型可以支持 JPA Transformation profile 的扩展了。

图 2. 为模型添加 JPA Transformation profile 支持
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

配置 Entity 和 ID

一旦为模型添加了 JPA Transformation profile 支持,开发人员就可以在 UML 类图上定制 JPA 的属性。首先我们使用 JPA 中最重要的配置元素:Entity。如图 3,选中一个 UML Class,在 Properties 页面中选择 stereotypes 标签页,然后点击“Apply stereotypes” 按钮,在弹出的对话框中选择 Entity。这样就能为该 Class 扩展了 Entity 的信息,对于 JPA Transformation 程序来说,它就会在执行转换时将该 UML Class 模型转化为一个带 Entity 注解的 Java 类。

图 3. 为 UML Class 应用 Entity stereotype
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

Entity 构造型还允许用户进行一些参数的设置,如 Catalog,Schema,Name 等,默认的表名会和实体类的类型一致(不含 package 名),而 Schema 会和 ORM.XML 中定义的 Schema 一致,因为我们采用自上而下的模型,数据库会根据 JPA 的配置自动生成,为了简化开发,我们这里不需要进行特殊设置,实体 stereotype 的属性配置采用默认值。

JPA 要求每个 Entity 必须至少使用一个 ID 字段来唯一标识,我们的模型使用简化的单个字段主键来简化开发。如图 4,在类图中选中 Invoice 实体,选择 InvoiceNo 属性,在 Properties View 的 stereotypes 标签页,点击“Apply stereotypes”,选择 ID 和 GeneratedValue。这样就为 InvoiceNo 属性附加了 ID 的扩展,同时还配置了自动生成值的功能。

图 4. 为实体配置 ID 和 GeneratedValuestereotype
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

请在属性配置页面中选择自动生成值的配置,这里我们选择“ID Entity”策略,说明生成的 ID 值是全局唯一的,参见图 5。请按照同样的方法配置 InvoiceItem 的 itemID 和 Customer 的 CustomerNo。

图 5. 为 InvoiceNo 字段配置 stereotype 的属性
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

由于 JPA 会默认的将类名映射到表名,属性映射到表的字段,对象之间的关系映射到表之间的外键关系,因此,经过以上的简单配置,我们的模型就可以在最小程度上使用 JPA 的功能,是已经可以使用的 JPA 转换配置了,在开发快速原型的时候,这样可以极大的简化我们的开发和配置工作。请按照同样方式配置 Cutomer 实体的 CutomerNo 和 InvoiceItem 的 itemID 的 ID 和 GeneratedValue stereotype。

配置 Entity 的 Column

大多数时候,我们需要对实体的属性作出一些配置,这是就需要对类的属性应用 Column 这个 stereotype,如图 6 可见,所有 JPA 规范中对 Column 的规约,您都可以在该 stereotype 的属性中配置,如字段的名称,长度,精度等。简化起见,这里我们不对字段的名称做配置,一切使用默认值,系统所生成的数据库的表中的字段名会和属性名称一致,这里我们会配置 Invoice 的所有 Decimal 类型的属性的精度,如图 6,对于所有的 Decimal 类型,我们设置 scale 和 precision。Scale 表示小数点后面的位数,这里我们使用 2 位。Precision 表示精度,这里我们用 12 位。同时请注意属性页中的 Column Definition 设置,您可以在此定义建表时创建此列的 DDL,使用该字段,您可以更灵活的配置实体属性对应的数据库的表字段。对所有的字符串类型的属性,我们看见其默认的长度是 255,这里我们采用默认值,如果有必要,您可以修改该配置。

图 6. 配置实体的 Column stereotype
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

实体继承关系设置

JPA 对于实体之间的继承关系是通过配置实体的 InheritanceType 构造型的 strategy 来实现,JPA 定义了以下三种配置方式:

InheritanceType.SINGLE_TABLE:为类的继承体系采用同一个表,会容纳所有子类的字段;

InheritanceType.JOINED:为类继承体系中的每个类创建不同的表,每个表只包含类中定义的列;

InheritanceType.TABLE_PER_ Class。

在 JPA Transformation profile 中,您需要为父类应用 Inheritance stereotype 来配置以上策略,如果不配置,系统的缺省值是 InheritanceType.SINGLE_TABLE。在 SINGLE_TABLE 和 JOINED 情况下,父类对应的表中会有一个 Discriminator 字段用于标识不同的子类类型。同时可以为每个子类应用 Discriminator stereotype 以配置该子类实例在父表 Discriminator 的字段中的值,如果不配置,就会默认使用子类的名字。在JOINED情况下,您可以通过将父类的 ID 设为 protected 来避免子类重复添加 ID 字段,这样父表和子表使用相同名字的 ID 字段。通常情况下,JOINED 的策略使用较多,它可以消除数据库表中的冗余字段,因此规范化级别比较高。如图 7,这里我们对 InvoiceItem 配置 Inheritance 的 strategy 就是 JOINED。

图 7. 配置 InvoiceItem 的 Inheritance stereotype
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

实体关联关系设置

实体之间的关联关系可以通过选择类图中对象的关系(类之间的关联线),并应用 RelationshipOptions stereotype 来进行配置。如图 8,您可以在 UML 编辑器中选择 Invoice 和 InvoiceItem 之间的关联线来应用“RelationshipOptions”这个 stereotype。

图 8. 对实体关联关系进行 JPA 配置
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

如图 8,RelationshipOptions stereotype 有三个可配置的值,我们的配置情况见表 1:

表 1. Invoice 和 InvoiceItem 的关联关系的 JPA 配置

属性属性含义属性值设置
cascade配置关联关系的增删查改的级联操作因为Invocie对 InvoiceItem的完全控制关系,我们这里配置为ALL,在Invocie发生任何变化时,JPA 都会级联的对该 Invoice 的所有 InvoiceItem执行同样的操作。
fetch配置加载方式,分为早加载和懒加载由于 Invoice 对 InvoiceItem的关系比较紧密,这里配置为早加载(EAGER)。
optional是否可选设置为 false,必选。

默认情况下,JPA 实体关联关系是没有级联设置的,加载方式也是早加载,如果您不想修改默认值,就不需要应用该 stereotype。请按照同样配置 Invoice 和 Customer 的关系,请将级联配置为无需级联,将加载改为懒加载,Optional也为 false。

到此为止我们介绍了一些基本的 JPA 注解如何通过 JPA Transformation 的 profile 进行配置。在 RSA7.5 中,大部分常用的的 JPA 注解都可以通过配置 JPA Transformation profile 的 stereotype 来自动生成。此时,我们的 UML 模型已经附加了较为完整的 JPA 语义,已经可以使用 JPA Transformation 进行转换了。

应用 UML-to-JPA 模型转换

创建和配置转换

在 RSA 中的选择菜单栏的“Modleing”->“Transform”->“New Configuration”菜单,在弹出的对话框中选择” UML-to-JPA”转换,某些情况下您需要选择“Show all Transformation s”选择框才能在下拉列表中找到该转换,如图 9,此时需要在弹出的”Confirm Enablement”对话框中选择OK按钮。

图 9. 选择 UML-to-JPA 转换
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

在 Name 输入框中输入转换的名称“SampleModel2 JPA”,点击Next,如图 10,在 Source and Target 页面中选择“SampleModel”作为 Source,点击“Create Target Container..”按钮以创建一个 JPA 项目作为转化生成的 JPA 实体类的容器。

图 10. 选择创建一个 JPA 项目作为转换目标的容器
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

如图 11,在弹出的“New JPA Project”的对话框中,输入项目名称“SampleModelPersistence”,用户可以配置是否在服务器环境中使用 JPA,这里为了简化问题,我们选择 TargetRuntime 为 None,选择 Configuration 为“Utility JPA project with Java 5.0”,并且不选择 “Add project to an RAR”这样就可以脱离服务器使用 JPA,同时有助于我们使用 JUNIT 测试代码快速的测试持久化程序的正确性。

图 11. 新建 JPA 项目的选项设置
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

如图 11,设置完成后直接点击 Finish 创建完成,后还可以进行其他配置。如图 12,在“Properties 页面”,对于是否自动生成 NamedQuery,这里我们选择 false,如果选择 true,会自动为每个字段生成一个 NamedQuery,会减低 JPA 的效率。对于是否生成 equals 方法和 hashCode,我们选择 true,这样可以更好的帮助我们进行开发。如图 13,在 Collections 对于 Collection,Set 等配置,建议统一使用 List,这样简化开发,在进行对象和对象之间的转换编程时,也可以做到简单一致。

图 12. 对 UML-to-JPA 转换的属性配置
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

图 13. 对集合的转换配置
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

至于 Mapping 页面中可以手工的配置映射转换规则,这个功能适用于了解其转换原理的高级用户。一般开发人员无需使用。

运行转换

如图 14,您可以通过转换编辑器的“Main”页面点击 Run 按钮来运行这个转换了,请注意运行页面上的基本选项(Conceptual,Mixed,Reconciled),本文所选范例属于从对象到数据库的一种自上而下的模式,因此我们选用 Conceptual 的转换模式,总是采用正向转换。

图 14. JPA 转换配置的主页面
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

运行完成后可以看见在 SampleModelPersitence 项目中生成了 UML 模型对应的 Java 类,所有的 Java 类中已经增加了相应的 JPA 的注解。此时我们还需要配置一下 JPA 的配置文件,首先编辑 Persistence.xml,输入清单 1 中的内容使得 JPA 知道要持久化哪些实体。

清单 1. Persistence.xml的内容

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
  <persistence-unit name="MyModelJPA"> 
  <class>my.sample.CreditItem</class> 
  <class>my.sample.Customer</class> 
  <class>my.sample.DiscountItem</class> 
  <class>my.sample.Invoice</class> 
  <class>my.sample.InvoiceItem</class> 
  <class>my.sample.PriceItem</class> 
</persistence-unit> 
</persistence> 
 

然后编辑 Orm.xml ,如清单 2,输入持久化单元需要对应的默认 Schema,这里我们的数据库中使用 MYSAMPLE 这个 Schema。

清单 2. Orm.xml的内容

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> 
<persistence-unit-metadata> 
    <persistence-unit-defaults> 
     <schema>MYSAMPLE</schema> 
    </persistence-unit-defaults> 
  </persistence-unit-metadata> 
 
</entity-mappings> 
 

JPA 持久化代码的运行时配置

现在我们的 JPA 配置文件和带 JPA 注解的 Java 对象已经生成了,可以进行相关的测试了,这里我们采用非容器环境的测试,在简单的 Java 代码中就可以测试使用 JPA 来操作持久化代码,首先我们进行环境的配置。

编译和运行时环境设置

由于WebSphere Application Server V7(WAS7)已经中已经包含了 JPA 的实现(包装了 OpenJPA ),如果开发的是 WAS7.0 的服务器端程序,在 RSA 中的环境变量就包含了对 JPA 的 jar 包的引用,因此无需做额外设置。如果是脱离服务器使用 JPA,您需要将 JPA 的 jar 包添加到上述 SampleModel JPA 项目的类路径中,本文的示例使用 WAS7 中的 JPA 包,参见图 15。

图 15. 使用 RSA 的测试环境中的 JPA jar 包
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

此外我们的测试数据库采用简单的 Derby 数据库,您只需要将 derby.jar 文件添加到 SampleModel JPA 项目的类路径中,测试时就可以使用 Derby 数据库了,请参考图 16 获取到 derby.jar。

图 16. 使用 RSA 中的 WAS7 测试环境中的 derby 数据库
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

此时我们需要在 persistence.xml 文件中添加数据库的配置,参考清单 3 配置 JPA 的数据库信息。

清单 3. 配置了数据库连接后的persistence.xml

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
  <persistence-unit name="MyModelJPA"> 
  <class>my.sample.CreditItem</class> 
  <class>my.sample.Customer</class> 
  <class>my.sample.DiscountItem</class> 
  <class>my.sample.Invoice</class> 
  <class>my.sample.InvoiceItem</class> 
  <class>my.sample.PriceItem</class> 
  <properties> 
     <property name="openjpa.ConnectionDriverName" 
     value="org.apache.derby.jdbc.EmbeddedDriver"/> 
     <property name="openjpa.ConnectionURL" 
     value="jdbc:derby:C:\DerbyDB\MYSAMPLE;create=true"/> 
     <property name="openjpa.ConnectionUserName" value=""/> 
     <property name="openjpa.ConnectionPassword" value=""/> 
     <property name="openjpa.jdbc.Schema" value="MYSAMPLE"/> 
     <property name="openjpa.jdbc.SynchronizeMappings" 
     value="buildSchema" /> 
    </properties> 
   
  </persistence-unit> 
</persistence> 
 

配置 JPA 的增强

Enhance 是使用 OpenJPA 必须的一个步骤,所谓 Enhance 是指使用 OpenJPA 提供的工具 PCEnhancer(org.apache.openjpa.enhance.PCEnhancer)对实体类进行处理的过程,被 Enhance 过的实体类能够支持性能优化、懒惰式装载等高级特性。 JPA 规范约定容器必须在部署时对 JPA 实体进行增强,对于非容器运行的情况,您可以选择运行时增强或者编译时增强。

通常情况下,编译时增强更加受欢迎,因为不需要运行时添加特别的参数。但是如果没有开发工具的支持,您可能需要在命令行调用编译命令。幸运的是,RSA 允许我们为项目配置多种编译,我们可以使用 JPA 提供的 ANT 任务来实现编译时增强,这种配置是一劳永逸的。首先我们需要创建一个 build.xml 文件,请参考清单 4 的内容在 SampleModelPersistence 项目中创建 build.xml。

清单 4. build.xml的内容

<project default="enhance"> 
  <target name="enhance"> 
  <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask" /> 
 
    <openjpac> 
     <config propertiesFile="${basedir}/bin/META-INF/persistence.xml" /> 
     <classpath< 
     <pathelement location="${basedir}/bin"/> 
     </classpath> 
    </openjpac> 
 
  </target> 
</project> 
 

然后我们需要为 JPA 的增强创建一个单独的 builder,请选择 SampleModelPersistence 项目,单击右键菜单中的 Properties 菜单,在弹出的对话框中的左侧树中选择 Builders 节点,如图 17,在右侧的属性页中选择“New..”按钮。

图 17. 为 SampleModelPersistence 项目创建 JPA 增强 Builder
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

在打开的对话框中进行该 Builder 的配置,首先输入 builder 名称“JPA _Builder”,然后配置设置项目基础路径和 ANT 编译脚本的位置,具体的配置值请参考图 18。

图 18. JPA 编译时增强的配置
使用 RSA V7.5 中的 UML-to-JPA 转换加速 JPA 开发

查看原图(大图)

同样在 Targets 页面中,设定 build 的目标为“enhance”,在 Class path 页面中需要增加 JPA 的 jar 包(com.ibm.ws.jpa.thinclient_7.0.0.jar )到编译路径中。点击 OK 保存设置,此时运行编译项目,RSA 就会自动的对编译后的实体类进行二进制代码级别的增强。

单元测试

到此我们就可以通过单元测试在非服务器环境中测试 JPA 的持久化功能了。请参考下载资料中的 SampleModelPersitenceTest 项目,在 ModelTest 类中我们的 testSaveInvoice 测试方法可以很好的使用 JPA 的 API 自动保存 Invoice 实体,避免了我们在保存和加载持久化对象时使用大量重复的 SQL 语句和映射代码。通过清单 5 中的测试代码,我们可以看到,由 JPA Transformation 生成的 JPA 实体可以很好的和数据库交互。

清单5. 用于测试持久化实体的JUNIT测试用例

package my.sample.test; 
 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 
 
import junit.framework.TestCase; 
import my.sample.Invoice; 
 
public class ModelTest extends TestCase { 
  public void testSaveInvoice(){ 
    Invoice invoice= new Invoice(); 
    invoice.setStoreName("MyStore"); 
    invoice.setPaymentType("Credit"); 
    EntityManagerFactory emf=Persistence.createEntityManagerFactory("MyModelJPA"); 
    EntityManager em = emf.createEntityManager(); 
    em.getTransaction().begin(); 
    em.persist(invoice); 
    em.getTransaction().commit(); 
    Query query= 
      em.createQuery("select obj from Invoice obj where obj.invoiceNo=:invoiceNo"); 
    query.setParameter("invoiceNo", invoice.getInvoiceNo()); 
    Invoice invoice2=(Invoice)query.getResultList().get(0); 
    assertTrue(invoice.equals(invoice2)); 
    em.close() ; 
 
  } 
} 
 
 

测试完成后,您的应用程序就可以使用类似的调用代码来进行 Java 对象的持久化操作了,这会节省你大量的时间,尤其当 JPA 注解和配置文件修改后,通过运行 JUNIT 测试用例,您可以快速的确定 JPA 持久化程序没有受到影响。当然,在实际的生产环境中,你需要更多复杂的 JPA 设置,RSA 7.5 中的 JPA Transformation profile 支持几乎所有的 JPA 注解的配置功能,您可以参考 RSA 的帮助文档以获取更为详细的信息。

总结

Java 持久化技术的发展使得程序员从大量的 Java 对象与数据库表的映射代码中解脱出来,提高了开发的效率。JPA 作为一种标准化的 Java 持久化解决方案,已经得到极大的应用,但是在实际的开发过程中,由于需求的变化,开发人员不得不进行很多重复的工作。通过本文的示例,读者可以了解到 RSA7.5 中的 JPA Transformation 为我们的持久化方案提供了一种模型驱动的开发的途径,允许我们在对象模型层面上进行 JPA 持久化元数据的配置,并能够自动将模型转换为 JPA 实体,在自顶向下和迭代的开发过程中可以最大限度的减少开发人员的冗余工作,能够有效的提高生产率。同时 JPA 提供了大量简化的默认设置,可以简化我们的开发配置。当然,JPA 等持久化框架并不能完全代替传统的数据库应用,高性能的查询和数据处理仍然需要使用传统的方式处理,JPA 的关注点在于帮助我们减少对象持久化的冗余代码,使得开发人员能够集中于应用逻辑,提高开发效率。

本文示例源代码或素材下载

Tags:使用 RSA UML

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接