我們將按照兩種不同的情況講述如何使用Kodo EJB進行開發,一種是通過命令行工具,另外一種是在Eclipse中使用Ant任務。
關于EJB3和JDO2的更多內容請大家查看文章最后參考資源中的相關內容。
為什么使用Kodo EJB在Kodo EJB框架中,對象和關系數據庫之間的映射(對象-表,對象屬性-字段等)都是使用JDK5.0中的最新特性—注釋(Annotation)來提供,不再需要提供額外的配置文件。
根據EJB3規范的要求,Kodo EJB除了支持在EJB容器中使用滿足重量級企業應用的需求之外,也支持在普通Java應用中采用,提供輕量級的持久層框架。只不過當我們在EJB容器中使用Kodo EJB時我們需要更多的工作以便滿足EJB容器的要求。
下載、安裝Kodo準備工作
由于Kodo是基于注釋機制的框架,我們必須使用JDK5.0完成開發工作。所以下載、安裝Kodo之前,請確保您已經下載和安裝了JDK5.0。
為了演示的需要,我們選擇MySQL數據庫作為持久化的目標數據庫,請大家自己到www.mysql.com下載最新的MySQL數據庫后安裝。
下載、安裝KodoKodo的最新版本是Kodo 4.0.0 Early Access 4,目前大家可以到http://www.solarmetric.com/去下載試用版本,下載時需要注冊,你會得到30天的License。
將下載的壓縮文件解壓到c:/kodo4目錄下(后面將使用%KODO_HOME%來引用這個目錄),打開%KODO_HOME%/bin/kodocmd.cmd文件,將其中的KODODIR設置為您的Kodo的安裝目錄,將JDKHOME設置為Java的安裝目錄。
Kodo EJB實例上面的工作完成以后,我們就可以開發Kodo EJB應用了,下面的例子將主要講述如何開發一個輕量級的Kodo EJB例子,支持在Java應用中的調用,而不依賴于EJB容器,關于如何在EJB容器中配置使用Kodo EJB是一個大的課題,作者將另外撰文詳細論述。
下面我們將用一個簡單的例子來說明創建Kodo EJB應用的典型步驟,實例中我們將創建名為Book的持久化對象,該對象將被持久化到本地的MySQL數據庫中。
請大家注意的是,下面的說明都基于Windows 2000操作系統,如果您使用其它操作系統,可能需要做出相應的變更。
- 建立工程目錄
在C:盤根目下創建名為KodoExamples的目錄,我們所有的類文件和配置都放在這個目錄下。
- 創建持久化類
新創建持久化類Book,為了說明的簡單,該類只有兩個屬性:id和name,其中id是書的編號(編號由MySQL數據庫自動生成),name屬性表示書的名稱。持久化類的全部代碼、注釋和說明如下:ackage org.vivianj.kodo.examples.beans; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; /** * Book 用于表征系統中的書籍對象,他有兩個屬性id - 書籍編號,書籍編號將由MySQL數據庫自動生成name - 書名 */ /* Entity注釋表示該類是持久化類,的name屬性是該實體在查詢中對應的唯一名稱,默認是類名 */ (name = "Book") /* Table注釋的name屬性指定該持久化類對應的數據表的名稱,默認數據表名和類名保持一致,為了增強代碼的可移植性,建議大家在name屬性中使用大寫英文字母 */ (name = "BOOKS") /* Inheritance注釋的strategy確定了持久化對象和數據表之間的關系,可選擇項包括SINGLE_TABLE、JOINED和TABLE_PER_CLASS,我們這里采用TABLE_PER_CLASS */ (strategy = InheritanceType.TABLE_PER_CLASS) public class Book { /* Id注釋表示該字段是標識字段 */ /* GeneratedValue注釋定義了該標識字段的產生方式,我們的演示系統中id由MySQL數據庫字段自動生成,因此選擇GenerationType.IDENTITY */ (strategy = GenerationType.IDENTITY) /* Column注釋的name屬性定義了該類屬性對應的數據字段的名稱,為了最大限度保持系統和數據庫之前的獨立性,建議使用大寫字符 */ (name = "ID") public int id; /* Basic注釋表示該屬性是基本屬性 */ /* Column注釋的name屬性定義了該類屬性對應的數據字段的名稱,為了最大限度保持系統和數據庫之前的獨立性,建議使用大寫字符 */ (name = "NAME") public String name = null;
- 準備數據庫
在MySQL數據庫中新建名為Kodo的數據庫。
- 準備配置文件
在C:KodoExamples新建META-INF目錄,隨后在該目錄下新建kodo.xml和persistence.xml文件。
a) Kodo.xml文件中提供訪問數據庫所需要的細節信息、使用Kodo所需要的授權(License)內容、Kodo運行時的日志管理等。 <?xml version="1.0"?> <persistence> <persistence-unit name=""> <properties> <!-- Kodo的序列號,請輸入您下載或者購買Kodo時得到的License --> <property name="kodo.LicenseKey" value="093D-BF3F-C10E-0F8F-0F00" /> <!-- 以下是訪問數據庫時需要提供的信息 --> <property name="kodo.ConnectionURL" value="jdbc:mysql://localhost/kodo" /> <property name="kodo.ConnectionDriverName" value="org.gjt.mm.mysql.Driver" /> <property name="kodo.ConnectionUserName" value="root" /> <property name="kodo.ConnectionPassword" value="root" /> <!-- 設置Kodo運行過程中的日志級別 --> <property name="kodo.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=DEBUG" /> </properties> </persistence-unit> </persistence> b) persistence.xml提供EJB實體管理所需要的信息,比如確定使用哪種持久化管理器和需要被管理的持久化類。 <?xml version="1.0"?> <persistence> <persistence-unit name=""> <provider>kodo.persistence.PersistenceProviderImpl</provider> <!-- 需要被Kodo EJB管理的持久化類 --> <class>org.vivianj.kodo.examples.beans.Book</class> </persistence-unit> </persistence>
- 編譯持久化類
打開一個命令行窗口,進入%KODO_HOME%/bin目錄下,執行kodocmd.cmd命令,然后將MySQL的驅動文件使用set classpath=%classpath%;c:/mysql-connector-java-3.1.8-bin.jar這樣的方式加入到CLASSPATH中。
執行javac C:KodoExamplesorgvivianjkodoxampleseans*.java編譯持久化類。
- 加強(Enhancer)持久化類
KODO中使用加強工具(Enhancer)對持久化類進行調整,支持性能優化、懶惰式裝載等特性。
我們可以使用kodoc C:KodoExamplesorgvivianjkodoxampleseans*.java這樣的命令來完成持久化類的加強工作。
- 生成數據庫表
KODO中提供了專門的MappingTool工具,能夠自動的根據持久化類及他們之間的關系為我們生成創建數據庫所需要的SQL語句或者直接創建數據表。
演示實例中,我們使用kodoc C:KodoExamplesorgvivianjkodoxampleseans*.java完成數據表的創建,命令執行完成后,我們訪問MySQL中的kodo數據庫,可以看到里面已經創建了名為books的數據表。
- 測試一下
現在,所有的工作都已經完成,我們可以編寫一段代碼測試一下上面的工作是否有效,在C:kodoExamples目錄下新建Test.java,然后輸入如下內容:
import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.PersistenceContextType; import org.vivianj.kodo.examples.beans.Book; public class Test { public static void main(String[] args) { /* 獲得EJB的實體管理器 */ EntityManagerFactory emf = Persistence.createEntityManagerFactory(null); EntityManager em = emf .createEntityManager(PersistenceContextType.EXTENDED); /* 開始事務 */ em.getTransaction().begin(); /* 創建新的持久化對象 */ Book book = new Book(); /* 設置Book對象的name屬性 */ book.name = "Kodo入門"; /* 持久化對象 */ em.persist(book); /* 結束事務 */ em.getTransaction().commit(); em.close(); emf.close(); } }
執行Test類,執行完后會發現books表中已經增加了一條新的記錄。
在Eclipse中開發Kodo EJB上面的步驟都是基于命令行的,操作起來不是很方便,因此我們需要考慮將Kodo的開發過程和Eclipse開發工具進行集成。
分析上面開發Kodo EJB的整個過程,只有步驟 5)加強(Enhancer)持久化類和 6)生成數據表和字段無法在Eclipse中直接實現,查看Kodo的幫助文檔,發現Kodo的發布包中已經提供了對應命令的Ant任務腳本,因此我們可以使用Ant來完成Eclipse和Kodo的集成。
我們仍然使用上面的例子來演示如何在Eclipse中開發Kodo EJB,我們打開Eclipse,新建立KodoExamples工程,將%KODO_HOME%ib下面所有jar文件加入到該工程的引用中,將您所使用的數據庫的JDBC驅動jar文件也加入到該工程的引用中。然后請大家參考上面的說明完成前5步工作,下面我們主要描述如何完成Ant配置文件。
- 基本配置內容
在工程的當前目錄下,新建build.xml文件,輸入如下內容:
<project name="kodo enhance" basedir="." default="enhance"> <!— 請將value的值設置為您安裝kodo時選擇的目錄 --> <property name="KODO_HOME" value="C:kodo4" /> <property name="src" value="." /> <property name="classes" value="." /> <!-- 準備公用的CLASSPATH路徑 ? <path id="build_classpath"> <pathelement location="" /> <pathelement location="" /> <!—此處請輸入數據庫驅動文件的路徑,作者使用的MySQL數據庫驅動 ? <pathelement location="C:/ mysql-connector-java-3.1.8-bin.jar" /> <fileset dir="/lib"> <include name="**/*.jar" /> </fileset> </path> </project>
- 編寫完成步驟 6)加強(Enhance)持久化類所需要的任務
和這個步驟對應的任務是kodo.ant.PCEnhancerTask類,在%KODO_HOME%srckodont下面我們可以看到PCEnhancerTask類的源代碼。首先使用taskdef加入新的任務類型kodoc,然后調用該任務完成工作。
在build.xml文件中增加如下內容:
<target name="enhance"> <!-- 引入新的Ant任務 ? <taskdef name="kodoc" classname="kodo.ant.PCEnhancerTask"> <!-- 引用上面步驟中定義的build_classpath作為CLASSPATH ? <classpath refid="build_classpath" /> </taskdef> <kodoc jdoEnhance="true"> <fileset dir="."> <!-- 指定需要被加強的持久化類,可以使用通配符* ? <include name="**/Book.java" /> </fileset> <!-- 引用上面步驟中定義的build_classpath作為CLASSPATH ? <classpath refid="build_classpath" /> </kodoc> </target>
- 編寫完成步驟 7)生成數據庫表所需要的任務
Kodo包中為這個任務提供的任務類kodo.jdbc.ant.MappingToolTask在Eclipse中執行時有點問題,我將它修改了一下,主要是修改執行該任務時使用的ClassLoader,現在可以滿足要求了。
在當前工程中新建kodo.jdbc.ant.MappingToolTask類(目錄中的類比lib文件中的類有更高的執行級別),類的代碼可以在%KODO_HOME%/src/kodo/jdbc/ant目錄下找到。在類源代碼中找到這兩行。
if (!MappingTool.run (conf, files, flags, loader)) throw new BuildException (_loc.get ("bad-conf", "MappingToolTask")); 將它修改為: if (!MappingTool.run (conf, files, flags, MappingTool.class.getClassLoader ())) throw new BuildException (_loc.get ("bad-conf", "MappingToolTask")); 現在,我們在build.xml文件中增加如下內容就可以完成項目中生成持久化類對應的數據庫表了: <target name="create-schema"> <!-- 引入新的Ant任務 ? <taskdef name="mappingtool" classname="kodo.jdbc.ant.MappingToolTask"> <!-- 引用上面步驟中定義的build_classpath作為CLASSPATH ? <classpath refid="build_classpath" /> </taskdef> <mappingtool action="refresh"> <!-- 引用上面步驟中定義的build_classpath作為CLASSPATH ? <classpath refid="build_classpath" /> <fileset dir=""> <!-- 指定需要生成數據表的持久化類,可以使用通配符* ? <include name="**/Book.java" /> </fileset> </mappingtool> </target>
現在你可以將打開Eclipse中的Ant視圖,然后再其中執行Enhance和create-schema任務,完成加強持久化類和創建數據庫表的工作,最后,你可以使用同樣的測試代碼完成代碼的測試工作。
總結Kodo是BEA最新發布的持久層框架,屏蔽了開發者訪問數據庫的眾多細節,為開發者提供了更加簡單的編程模式,大大較少了開發量,目前Kodo支持EJB3和JDO2標準。BEA承諾在不久的將來將Kodo的核心代碼開源。
本文中,作者通過一個簡單的例子,詳細地講解了如何完成Kodo EJB的開發工作,同時講解了如何在Eclipse中集成Kodo完成開發的步驟,并且解決了集成過程中還存在的一個小問題,希望能夠幫助大家更好的學習和使用Kodo.