TriActive JDO (TJDO) 是 Sun Java Data Objects (JDO) 1.0 規(guī)范的一個(gè)輕型的、開(kāi)放源代碼的實(shí)現(xiàn)。通過(guò)它,開(kāi)發(fā)人員可以將一種透明的持久性機(jī)制用于任何JDBC 兼容的數(shù)據(jù)庫(kù)和任何 Java 對(duì)象。在本文中,Java 開(kāi)發(fā)人員 Jeff Gunther 通過(guò)一個(gè)例子介紹了 TJDO,這個(gè)例子示范了如何在MySQL 數(shù)據(jù)庫(kù)中持久存儲(chǔ)域模型。除了說(shuō)明 TJDO 的特定實(shí)現(xiàn)細(xì)節(jié)之外,本文還回顧了 JDO 規(guī)范的基本概念和組件。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
隨著 Java 平臺(tái)快速延伸到現(xiàn)代企業(yè)的每個(gè)角落,開(kāi)發(fā)人員被淹沒(méi)在新技術(shù)和新規(guī)范的縮寫(xiě)詞中,每一個(gè)都許諾解除各種 IT 病痛。即使在 Java 社區(qū)內(nèi)部,對(duì)于開(kāi)發(fā)人員和管理者來(lái)說(shuō),也同樣難以斷定哪種技術(shù)只是曇花一現(xiàn),哪種技術(shù)能夠生存下去。如果抽查一些 Java 開(kāi)發(fā)人員,詢(xún)問(wèn)他們?cè)趹?yīng)用程序中如何持久存儲(chǔ)數(shù)據(jù),您可能會(huì)得到各種不同的答案。有些答復(fù)可能是對(duì)關(guān)系數(shù)據(jù)庫(kù)使用基本的 JDBC,有些可能使用純面向?qū)ο蟮臄?shù)據(jù)庫(kù),而另一些可能在應(yīng)用程序服務(wù)器中使用 Container Managed Persistence 2.0 (CMP) 。盡管這些方案能夠而且確實(shí)為開(kāi)發(fā)人員提供了持久性服務(wù),每種技術(shù)都有各自不同的缺點(diǎn)、局限和代價(jià)。
與 Java 社區(qū)中的其他項(xiàng)目類(lèi)似,JDO 規(guī)范是通過(guò) Java Community Process 按照 Java Specification Request 12 創(chuàng)建的。JDO 架構(gòu)師的主要目標(biāo)之一是,向開(kāi)發(fā)人員提供一種透明的機(jī)制,不考慮底層數(shù)據(jù)存儲(chǔ)方式處理和操作持久信息。從一開(kāi)始,它就被設(shè)計(jì)成讓開(kāi)發(fā)人員逃避開(kāi)發(fā)持久性基礎(chǔ)設(shè)施的苦差事。因?yàn)殚_(kāi)發(fā)人員使用的通用 API 可以跨越不同的數(shù)據(jù)存儲(chǔ)進(jìn)行互操作,開(kāi)發(fā)團(tuán)隊(duì)就可以延遲決定特定項(xiàng)目將使用或支持什么樣的數(shù)據(jù)存儲(chǔ)方式。這些好處都減少了編碼的工作量,使開(kāi)發(fā)人員能夠關(guān)注項(xiàng)目的其他相關(guān)領(lǐng)域。與 Java 家族中的其他規(guī)范相似,JDO 消除了鎖定到特定供應(yīng)商的危險(xiǎn)。每個(gè)供應(yīng)商的 JDO 實(shí)現(xiàn)都提供了一套不同的支持?jǐn)?shù)據(jù)源的特性和類(lèi)型。根據(jù)項(xiàng)目的要求和預(yù)算,與其他的相比某個(gè)供應(yīng)商可能更有吸引力。
![]() |
|
在不購(gòu)買(mǎi)許可證的前提下,為了讓您有機(jī)會(huì)嘗試 JDO,我們使用了 TriActive JDO (TJDO),JDO 1.0 規(guī)范的一個(gè)輕型的、開(kāi)放源代碼的實(shí)現(xiàn)。TJDO 支持多種 JDBC 兼容的數(shù)據(jù)庫(kù)作為數(shù)據(jù)存儲(chǔ)方式。
為了使用提供的文件對(duì) TJDO 進(jìn)行完全測(cè)試,您的環(huán)境需要滿(mǎn)足以下最低要求:
- 安裝有 Java 2 SDK, Standard Edition 1.4 或以上版本
- 安裝有 Apache Ant 1.5.3 或以上版本
- 安裝有 MySQL Server 4.0.14 或以上版本
這些技術(shù)的鏈接請(qǐng)參閱 參考資料 。 注意,盡管 Ant 構(gòu)造腳本應(yīng)該是跨平臺(tái)的,這些示例類(lèi)只在 Microsoft Windows XP 上測(cè)試和驗(yàn)證過(guò)。在開(kāi)始討論一些代碼和 JDO 基礎(chǔ)之前,我們首先要安裝并配置源代碼。
為了安裝源代碼包,需要完成以下步驟:
- 下載 源代碼 包。
- 將 j-tjdo.zip 文件解壓到一個(gè)臨時(shí)目錄。
- 在 MySQL 環(huán)境中創(chuàng)建名為 tjdo 的數(shù)據(jù)庫(kù)
-
打開(kāi)
common.properties
文件,修改 MySQL 鍵/值對(duì),以匹配您的環(huán)境。下面是一個(gè)例子:...
mysql.server=127.0.0.1
mysql.database=tjdo
mysql.user=root
mysql.password=
本文的基本目標(biāo)是,為您在應(yīng)用程序中開(kāi)始使用 TJDO 提供必要的知識(shí)和信息。在討論如何測(cè)試提供的示例代碼之前,我首先回顧一些使用 TJDO 所需要的一般步驟。您會(huì)發(fā)現(xiàn)許多步驟也適用于其他的 JDO 實(shí)現(xiàn)。繼續(xù)閱讀本文之前并不需要完全了解這些步驟,這只是為您將來(lái)的項(xiàng)目勾勒一個(gè)大綱。本文提供的源代碼包,在其開(kāi)發(fā)過(guò)程中經(jīng)歷了其中的每個(gè)步驟。
- 用普通的原 Java 對(duì)象(POJO)創(chuàng)建域模型。
- 創(chuàng)建支持應(yīng)用程序代碼。
- 編譯類(lèi)。
- 創(chuàng)建 XML 元數(shù)據(jù)文件,描述域類(lèi)的持久性行為。
- 增強(qiáng)編譯后的類(lèi)的字節(jié)碼。
- 如果使用關(guān)系數(shù)據(jù)庫(kù)作為數(shù)據(jù)存儲(chǔ),創(chuàng)建適當(dāng)?shù)臄?shù)據(jù)庫(kù)架構(gòu)。
為了便于回顧 JDO 的基本概念和 API,示例源代碼中包含一個(gè)簡(jiǎn)單的域模型。圖 1 表示 POJO 的 UML 圖。在這個(gè)例子中,
Developer
實(shí)例代表開(kāi)發(fā)軟件的某個(gè)雇員。類(lèi)似地,
Manager
實(shí)例代表管理其他雇員的特殊雇員,
Location
實(shí)例代表雇員、開(kāi)發(fā)人員和管理人員工作的物理建筑物。
圖 1. Java 對(duì)象的 UML 圖
這些域類(lèi)和支持類(lèi)一起把數(shù)據(jù)持久存儲(chǔ)到 MySQL。
![]() |
|
現(xiàn)在我們已經(jīng)介紹了如何配置工作環(huán)境和基本的域模型,接下來(lái)將討論如何使用 JDO API 把這些對(duì)象及其關(guān)系持久存儲(chǔ)到 MySQL。因?yàn)楸疚闹粚?duì) JDO 和 TJDO 進(jìn)行一般性介紹,不會(huì)詳細(xì)討論 JDO API 的具體特性。如果希望進(jìn)一步了解某些組件,您可以在 參考資料 中找到 JDO 1.0 規(guī)范的鏈接。
清單 1 中的代碼片段說(shuō)明了連接 JDO 和 MySQL 所需的初始屬性。
清單 1. TJDOTest.java 文件
0 ... |
讓我們看一看代碼中的主要部分:
-
JDO 規(guī)范要求每個(gè) JDO 供應(yīng)商都提供一個(gè)類(lèi)實(shí)現(xiàn)
PersistenceManagerFactory
。PersistenceManagerFactory
用于獲得PersistenceManager
實(shí)例。PersistenceManager
是開(kāi)發(fā)應(yīng)用程序支持代碼使用的主要接口,負(fù)責(zé)把數(shù)據(jù)持久存儲(chǔ)到 MySQL。
-
第 7 到 10 行定義了和 MySQL 的連接細(xì)節(jié)。傳遞給該類(lèi)的每個(gè)參數(shù)都定義在
common.properties
文件中,該文件位于生成目錄的根目錄下。
- 如果參數(shù)不存在,第 11 行要求 TJDO 在運(yùn)行時(shí)自動(dòng)在 MySQL 中創(chuàng)建支持表。
-
第 13 到 14 行,屬性被傳遞給一個(gè)幫助器類(lèi),創(chuàng)建了一個(gè)
PersistanceManagerFactory
和一個(gè)PersistanceManager
。
-
第 16 到 20 行從
PersistanceManager
創(chuàng)建一個(gè)Transaction
對(duì)象并啟動(dòng)它,保證所有數(shù)據(jù)在事務(wù)級(jí)上是一致的。
清單 2 說(shuō)明了操作和用數(shù)據(jù)填充的域模型。首先要?jiǎng)?chuàng)建一個(gè)
Location
對(duì)象,然后創(chuàng)建兩個(gè)雇員:
Developer
和
Manager
。最后,我們向
Location
增加新建的雇員。
清單 2. TJDOTest.java 文件
... |
清單 3 中的代碼片段展示了 JDO 的優(yōu)美之處。清單 2 中創(chuàng)建的每個(gè)對(duì)象傳遞給
PersistanceManager
的
makePersistent
函數(shù)。僅此而已。魔術(shù)般地,所有數(shù)據(jù)都被添加到數(shù)據(jù)庫(kù)中。您完全不需要擔(dān)心任何
SQL INSERT
語(yǔ)句、數(shù)據(jù)庫(kù)連接或者關(guān)系表。TJDO 全部完成了取得對(duì)象和向數(shù)據(jù)庫(kù)插入數(shù)據(jù)的工作。
清單 3. TJDOTest.java 文件
... |
為了把支持應(yīng)用程序代碼和域模型結(jié)合起來(lái),首先要?jiǎng)?chuàng)建一個(gè) XML 元數(shù)據(jù)文件,描述具有持久性能力的類(lèi)。在字節(jié)碼增強(qiáng)過(guò)程中和運(yùn)行期間將使用這些文件。必須為每個(gè)類(lèi)創(chuàng)建名為
<類(lèi)名>.jdo
的文件。清單 4 給出了這個(gè)域模型中所用的
Location.jdo
文件:
清單 4. Location.jdo 文件
1 <?xml version="1.0" encoding="UTF-8"?> |
讓我們分析一下這個(gè) XML 文件中的重要成分:
-
第 6 到 23 行定義了類(lèi)屬性和適當(dāng)?shù)淖侄卧亍n?lèi)元素的第二個(gè)屬性稱(chēng)為
identity-type
。TJDO 只支持datastore
作為它的 identity 類(lèi)型。
-
第 7 到 10 行定義了一個(gè)集合字段。這個(gè)字段用于存儲(chǔ)在特定辦公地點(diǎn)工作的雇員。集合元素的
element-type
屬性定義存儲(chǔ)在集合中的類(lèi)的類(lèi)型。
- 第 11 到 22 行定義各種字符串字段,TJDO 使用 extension 元素確定 MySQL 表的屬性。
關(guān)于 JDO 元數(shù)據(jù)文件各種元素和屬性的更多信息,請(qǐng)參閱 參考資料 。
要編譯、生成和測(cè)試程序包,按以下步驟:
-
檢查 MySQL 數(shù)據(jù)庫(kù)服務(wù)器中是否已經(jīng)建立了稱(chēng)為
tjdo
的數(shù)據(jù)庫(kù)。 -
在解壓源代碼的目錄中鍵入
ant clean
以清理環(huán)境。 -
鍵入
ant
啟動(dòng)生成過(guò)程。
如果環(huán)境滿(mǎn)足要求并且配置正確,您將看到與清單 5 類(lèi)似的結(jié)果:
清單 5. 生成過(guò)程成功地輸出結(jié)果
Buildfile: build.xml |
鍵入
ant test
測(cè)試給出的代碼。如果環(huán)境設(shè)置正確,MySQL 中的
tjdo
數(shù)據(jù)庫(kù)將包含所有的
Location
、
Developer
和
Manager
數(shù)據(jù)。
TJDO 是 Sun Java Data Objects (JDO) 1.0 規(guī)范的一個(gè)開(kāi)放源代碼的實(shí)現(xiàn),為開(kāi)發(fā)人員提供了一種很棒的方式,無(wú)論底層數(shù)據(jù)存儲(chǔ)如何都可以透明地持久存儲(chǔ)數(shù)據(jù)。盡管 JDO 規(guī)范的發(fā)展還剛剛起步,它已經(jīng)填補(bǔ)了 Java 社區(qū)中的一個(gè)空白。JDO 實(shí)現(xiàn)(比如 TJDO)把關(guān)系數(shù)據(jù)庫(kù)和面向?qū)ο蟮?Java 語(yǔ)言相結(jié)合,為開(kāi)發(fā)人員提供了一個(gè)現(xiàn)在就可以使用的功能強(qiáng)大的工具。為了幫助您完成這項(xiàng)任務(wù),示例程序包提供了一個(gè)生成和打包的框架,可用于把 TJDO 合并到您的項(xiàng)目中。
-
您可以參閱本文在 developerWorks 全球站點(diǎn)上的
英文原文
.
-
下載本文中所用的示例
源代碼
。
-
SourceForge 上的
TJDO 項(xiàng)目頁(yè)
,提供了您開(kāi)始使用這一 JDO 實(shí)現(xiàn)所需要的全部信息。
-
請(qǐng)參閱
Java Data Objects specification
。
-
訪(fǎng)問(wèn)
IBM developer kits
頁(yè)面,查看 IBM 所提供的 Java 技術(shù) SDK 列表。
-
從 Apache Software Foundation 下載
Ant 1.5.4
。
-
從 MySQL AB 下載
MySQL 4.0.14
。
-
作為 JDO 的優(yōu)秀入門(mén)讀物,Paul Monday 的教程“
JAVA數(shù)據(jù)對(duì)象上機(jī)實(shí)踐
” (
developerWorks
,2002 年 7 月)是一個(gè)很好的起點(diǎn)。
-
JDO Central
是內(nèi)容豐富的 JDO 開(kāi)發(fā)者資源網(wǎng)站,無(wú)論是經(jīng)驗(yàn)豐富的開(kāi)發(fā)老手還是初學(xué)者都很適合。尤其是,基于 Web 的論壇更是交流和分享 JDO 觀點(diǎn)的一種極好方式。
-
在
developerWorks
Java 技術(shù)專(zhuān)區(qū)
可以找到數(shù)百篇有關(guān) Java 編程各個(gè)方面的文章。
![]() |
||
![]() |
Jeff Gunther 是 Studio B 的作者,也是 Intalgent Technologies 的總經(jīng)理和創(chuàng)始人,這家公司是新興的軟件產(chǎn)品和解決方案提供商,其產(chǎn)品采用 Java 2 Enterprise Edition 和 Lotus Notes/Domino 平臺(tái)。Jeff 是一位應(yīng)用程序和基礎(chǔ)設(shè)施架構(gòu)師,具有架構(gòu)、設(shè)計(jì)、開(kāi)發(fā)、部署和維護(hù)復(fù)雜軟件系統(tǒng)的經(jīng)驗(yàn)。他豐富的經(jīng)驗(yàn)包括運(yùn)行于多平臺(tái)上的軟件的整個(gè)生命期的開(kāi)發(fā),從 Web 服務(wù)器直到嵌入式設(shè)備。Jeff 從早期的“Mosaic 以前”時(shí)代開(kāi)始就投身于因特網(wǎng)行業(yè)。可以通過(guò) jeff.gunther@intalgent.com 和 Jeff 聯(lián)系。 |
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
