本文介紹 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. 示例用對象模型
這個簡單的對象模型,主要用於描述超市的購物小票,其中 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 支持
配置 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
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
請在屬性配置頁面中選擇自動生成值的配置,這裡我們選擇“ID Entity”策略,說明生成的 ID 值是全局唯一的,參見圖 5。請按照同樣 的方法配置 InvoiceItem 的 itemID 和 Customer 的 CustomerNo。
圖 5. 為 InvoiceNo 字段配置 stereotype 的屬性
由於 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
實體繼承關系設置
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
實體關聯關系設置
實體之間的關聯關系可以通過選擇類圖中對象的關 系(類之間的關聯線),並應用 RelationshipOptions stereotype 來進行配置 。如圖 8,您可以在 UML 編輯器中選擇 Invoice 和 InvoiceItem 之間的關聯 線來應用“RelationshipOptions”這個 stereotype。
圖 8. 對實體關聯關系進行 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 轉換
在 Name 輸入框中輸入轉換的名稱“SampleModel2 JPA”,點擊 Next,如圖 10,在 Source and Target 頁面中選擇 “SampleModel”作為 Source,點擊“Create Target Container..”按鈕以創建一個 JPA 項目作為轉化生成的 JPA 實體類的容 器。
圖 10. 選擇創建一個 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 項目的選項設置
如圖 11,設置完成後直接點擊 Finish 創建完成,後還可以進行其他 配置。如圖 12,在“Properties 頁面”,對於是否自動生成 NamedQuery,這裡我們選擇 false,如果選擇 true,會自動為每個字段生成一 個 NamedQuery,會減低 JPA 的效率。對於是否生成 equals 方法和 hashCode ,我們選擇 true,這樣可以更好的幫助我們進行開發。如圖 13,在 Collections 對於 Collection,Set 等配置,建議統一使用 List,這樣簡化開 發,在進行對象和對象之間的轉換編程時,也可以做到簡單一致。
圖 12. 對 UML-to-JPA 轉換的屬性配置
圖 13. 對集合的轉換配置
至於 Mapping 頁面中可以手工的配置映射轉換規則,這個功能適用於了解 其轉換原理的高級用戶。一般開發人員無需使用。
運行轉換
如圖 14,您可以通過轉換編輯器的“Main”頁面點擊 Run 按鈕來運行這 個轉換了,請注意運行頁面上的基本選項(Conceptual,Mixed,Reconciled) ,本文所選范例屬於從對象到數據庫的一種自上而下的模式,因此我們選用 Conceptual 的轉換模式,總是采用正向轉換。
圖 14. 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 包
此外我們的測試數據庫采用簡單的 Derby 數據庫,您只需要將 derby.jar 文件添加到 SampleModel JPA 項目的類路徑中,測試時就可以使用 Derby 數據 庫了,請參考圖 16 獲取到 derby.jar。
圖 16. 使用 RSA 中的 WAS7 測試環境中的 derby 數據庫
此時我們需要在 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
在打開的對話框中進行該 Builder 的配置,首先輸入 builder 名稱 “JPA _Builder”,然後配置設置項目基礎路徑和 ANT 編譯腳本的 位置,具體的配置值請參考圖 18。
圖 18. 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 的關注點在於幫助我們減少對象持久化的冗余代碼,使得開發 人員能夠集中於應用邏輯,提高開發效率。
原文地址:http://www.ibm.com/developerworks/cn/rational/r-cn- rsav75umltojpa/