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操作系统,如果您使用其它操作系统,可能需要做出相应的变更。
建立工程目录在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="" /> <!—此处请输入数据库驱动文件的路径,作者使用的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.
参考资源:
EJB3规范:http://jcp.org/aboutJava/communityprocess/pfd/jsr220/index.html
JDO2规范:http://jcp.org/aboutJava/communityprocess/pfd/jsr243/index.html
Kodo在线文档:http://solarmetric.com/kodo/Documentation/4.0.0EA4/docs/full/html/index.html
作者简介
唯J族(www.vivianj.org)创始人,BEA 杭州User Group负责人,自由撰稿人,开源项目BuildFileDesigner(buildfiledesign.sourceforge.net)和V-Security(v-security.sourceforge.net)创始人。