前言:
在使用“代码生成器”插件时,第一步会自动生成业务对象文件XX.java和Hibernate映射文件XX.hbm.xml; 下面就这一步骤的实现原理做一下简要的介绍和讲解。在支持“代码生成器”插件运行的“resource”文件夹 (一般我们都把它放在需要自动代码生成的项目根目录下) 中有一个叫做“build-hibernate.xml.vm”的模板文件,它是.用来真正生成一个需要Ant 来执行的一个Ant脚本文件,就是我们通常看到的“avicit-build.xml”文件,最终我们所需要自动生成的业务对象文件XX.java和Hibernate映射文件XX.hbm.xml就是通过Ant来执行这个“avicit-build.xml”脚本文件所生成的。
正文:
第一部分:Middlegen 简介
<target name="gen-hbm" depends="init">
<middlegen
appname="${package}"
prefsdir="."
gui="${gui}"
databaseurl="${database.url}"
driver="${database.driver}"
username="${database.userid}"
password="${database.password}"
schema="${database.schema}"
catalog="${database.catalog}"
>
<hibernate
version="${version}"
destination="${dest.dir}"
package="\${package}"
genXDocletTags="${gen.xdoclet-tag}"
standardCascade="${hibernate.cascade}"
javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"
/>
<table name="${table}" />
</middlegen>
</target>
<target name="gen-java" depends="gen-hbm">
<hbm2java output="${dest.dir}">
<fileset dir="${dest.dir}">
<include name="${hbm}" />
</fileset>
</hbm2java>
</target>
在上面的“build-hibernate.xml.vm”的模板文件中,我们会找到下面这两个target <target name="gen-hbm"…> 和 <target name="gen-java"…>。里面我们还会找到<middlegen> 和<hbm2java>这两个task。下面是“build-hibernate.xml.vm”模板文件中对这两个task的定义:
<taskdef
name="middlegen"
classname="middlegen.MiddlegenTask"
classpathref="middlegen.classpath"
/>
<taskdef
name="hbm2java"
classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
classpathref="hibernate-ext.classpath"
/>
在这里我们用到了middlegen.MiddlegenTask类,它就是Middlegen这个开源代码生成框架为我们提供的。<<Middlegen is an open source code generation framework that provides a general-purpose database-driven engine using various tools such as JDBC, Velocity, Ant and XDoclet>>。
使用Hibernate的一个不便之处就是要维护数据库schema,hbm文件和java文件的一致性,而Middlegen可以帮助我们完成这些。
Middlegen是一个基于Xdoclet的代码,配置文件自动生成工具。它支持目前流行的大部分的技术,例如EJB,JDO,Hibernate,Torque,JSP/Struts等。Middlegen主要根据我们已有的数据库Schema根据我们的要求来自动的生成我们所需要的文件,这大大的降低了开发难度,提高了开发速度。使用Middlegen的另一个显而易见的好处是我们所有的代码可以在一分钟之内和数据库同步。
第二部分:使用Middlegen生成业务对象文件XX.java和Hibernate映射文件XX.hbm.xml
使用Middlegen自动的生成Hbm文件和Java文件包括两步,第一,根据数据库Schema生成Hbm文件。第二,根据hbm文件生成与之对应得Java文件,这些文件主要是与数据库表对应得持久化类。Middlegen的主要功能都必须在Ant环境下使用,下述build文件片断说明了如何定义自定义的任务(task)
<taskdef
name="middlegen"
classname="middlegen.MiddlegenTask"
classpathref="classpath.path"/>
<taskdef
name="hbm2java"
classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
classpathref="classpath.path"/>
其中第一个taskdef定义了用于根据数据库schema生成hbm文件的自定义任务(middlegen)。第二个taskdef定义了用于使用hbm文件自动生成持久化Java文件的自定义任务(hbm2java)。其中要说明的是classpath.path指定的路径下必须包含middlegen携带的jar文件和hibernate携带的jar文件。
第三部分:使用自定义任务来生成hbm文件。
<target name="mid-gen" depends="mid-init">
<taskdef
name="middlegen"
classname="middlegen.MiddlegenTask"
classpathref="classpath.path"/>
<middlegen appname="mda"
prefsdir="${conf.dir}"
gui="false"
databaseurl="${config.database.url}"
driver="Oracle.JDBC.driver.OracleDriver"
username="${config.database.user}"
password="${config.database.password}"
schema="${config.database.user}"
includeViews="false">
<hibernate destination="${build.src-gen.dir}"
package="entity"
genXDocletTags="true" javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"/>
</middlegen>
</target>
上述build片断中middlegen部分主要说明了在使用middlegen过程中的一些配置,关于数据库部分不用多说,主要说明gui和prefsdir部分。Middlegen自带了一个GUI界面用来即时的变更数据库字段和生成文件之间的映射关系,如果将gui属性设置为true,那么在代码生成之前会跳出一个界面让你来配置数据库字段和生成文件之间的对应关系,但是对于每日构建来说这不太合适,因为这个过程需要人为的干涉,哪怕只是点击确认按钮。同时middlegen提供了一个prefsdir选项,middlegen会自动地在该选项指定的目录下寻找文件appname-prefs.properties,根据该文件中定义的对应关系来生成文件。其中appname就是上述定义的appname,本例中为mda-prefs.properties。
hibernate部分主要说明生成hbm文件的一些属性,例如destination说明了生成文件的位置。Package说明了生成hbm文件对应的java文件的所在包。GenXDocletTags说明了是否在hbm文件内部保留元数据标记。