Kodo EJB:符合EJB3規範的持久層架構

來源:互聯網
上載者:User
規範   Kodo是BEA公司收購SolarMetric公司後獲得的持久層架構項目,以前只是支援JDO標準,2006年2月13日,BEA公司宣布發布Kodo項目的最新版本--Kodo 4.0.0 Early Access 4,Kodo 4.0.0 EA4支援EJB3和JDO2兩個標準,本文中,我們將首先學習和瞭解KODO EJB,瞭解如何使用Kodo EJB完成開發工作。

  我們將按照兩種不同的情況講述如何使用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資料庫後安裝。

  下載、安裝Kodo

  Kodo的最新版本是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作業系統,如果您使用其它作業系統,可能需要做出相應的變更。

  1. 建立工程目錄

      在C:盤根目下建立名為KodoExamples的目錄,我們所有的類檔案和配置都放在這個目錄下。

  2. 建立持久化類

      新建立持久化類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; 
  3. 準備資料庫

      在MySQL資料庫中建立名為Kodo的資料庫。

  4. 準備設定檔

      在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>
  5. 編譯持久化類

      開啟一個命令列視窗,進入%KODO_HOME%/bin目錄下,執行kodocmd.cmd命令,然後將MySQL的驅動檔案使用set classpath=%classpath%;c:/mysql-connector-java-3.1.8-bin.jar這樣的方式加入到CLASSPATH中。

      執行javac C:KodoExamplesorgvivianjkodoxampleseans*.java編譯持久化類。

  6. 加強(Enhancer)持久化類

      KODO中使用加強工具(Enhancer)對持久化類進行調整,支援效能最佳化、懶惰式裝載等特性。

      我們可以使用kodoc C:KodoExamplesorgvivianjkodoxampleseans*.java這樣的命令來完成持久化類的加強工作。

  7. 產生資料庫表

      KODO中提供了專門的MappingTool工具,能夠自動的根據持久化類及他們之間的關係為我們產生建立資料庫所需要的SQL語句或者直接建立資料表。

      示範執行個體中,我們使用kodoc C:KodoExamplesorgvivianjkodoxampleseans*.java完成資料表的建立,命令執行完成後,我們訪問MySQL中的kodo資料庫,可以看到裡面已經建立了名為books的資料表。

  8. 測試一下

  現在,所有的工作都已經完成,我們可以編寫一段代碼測試一下上面的工作是否有效,在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設定檔。

  1. 基本配置內容

      在工程的目前的目錄下,建立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> 
  2. 編寫完成步驟 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> 
  3. 編寫完成步驟 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.



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。