这里将利用xdoclet来为hibernate生成相关代码(由Customer.java生成Customer.hbm.xml),看看xdoclet对提供工作效率的。
一 运行环境:
1、xdoclet
2、ant
需要的jar包有
xdoclet-/X.X.X/.jar
xdoclet-hibernate-module-/X.X.X/.jar
xdoclet-xjavadoc-/X.X.X/.jar
xdoclet-xdoclet-module-/X.X.X/.jar
log4j-/X.X.X/.jar
commons-collections-2.0.jar
commons-logging.jar
前四个可以从xdoclet里的lib里面找到(这里“ /X.X.X/ ” 表示版本号),后面的几个我想大家都熟了吧可以从很多地方找到。
二 程序
看下文件结构
.(项目目录)
|
-src(文件夹,命名src.dir,存放源文件)
|
-lib(文件夹,命名lib.dir,存放上面提到的几个jar文件)
|
-*.jar
|
-bin(文件夹,命名bin.dir)
|
-src(文件夹,存放生成的*.java文件,这里将不用到)
|
-classes(文件夹,存放所编译的*.class文件)
|
-build.xml
看下源程序吧。
1、Customer.java
/*
* Created on 2004-12-20
* @author roson
*/
package hibernate;
import java.util.Set;
import java.util.Collections;
/**
* @author roson
* @since 1.0
* @version 1.0
* @hibernate.class tables="customers"
*/
public class Customer {
/**This customer's identifier field.
*/
private long id;
/**This customer's name field.
*/
private String name;
/**The customer's orders set.
*/
private Set orders=Collections.EMPTY_SET;
/**The default construtor for Hibernate to instantiate with.
*/
public Customer() {}
/**The getter method for this Customer's identifier.
*
* @hibernate.id generator-class="native"
*/
public long getId()
{
return id;
}
/**The setter method for this Customer's identifier.
*/
public void setId(long id)
{
this.id=id;
}
/**The getter method for this Customer's name.
*
* @hibernate.property
*/
public String getName()
{
return name;
}
/**The setter method for this Customer's name.
*/
public void setName(String name)
{
this.name=name;
}
/**The getter method for this Customer's orders.
*
* @hibernate.set role="orders"
*
* @hibernate.collection-key column="customer_id"
*
* @hibernate.collection-one-to-many class="Order"
*/
public Set getOrders()
{
return orders;
}
/**The setter method for this Customer's orders.
*/
public void setOrders(Set orders)
{
this.orders=orders;
}
}
可以看到在源程序中多了一些注释之类的标签,xdoclet就是通过这些标签来识别自动生成xml文件的,除此之外Customer.java与普通的javabean没什么区别。
注意:这里Customer.java打包为hibernate,如要改动要更改一下build.xml。
2、build.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="hibernate" default="compile" basedir=".">
<property name="src.dir" location="src"></property>
<property name="bin.dir" value="bin"></property>
<property name="lib.dir" location="lib"></property>
<path id="lib.path">
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
<pathelement location="lib/xdoclet-hibernate-module-1.2.1.jar"/>
</path>
<target name="init">
<tstamp>
<format property="TODAY" pattern="yy-mm-d"/>
</tstamp>
<mkdir dir="bin"/>
<mkdir dir="${bin.dir}/src"/>
<mkdir dir="${bin.dir}/classes"/>
<taskdef name="hibernatedoclet"
classname="xdoclet.modules.hibernate.HibernateDocletTask"
classpathref="lib.path"
/>
<taskdef name="ejbdoclet"
classname="xdoclet.ejb.EjbDocletTask"
classpathref="lib.path">
</taskdef>
</target>
<target name="compile" depends="init,hibernate">
<javac srcdir="${src.dir};${bin.dir}/src" destdir="${bin.dir}/classes">
<classpath refid="lib.path"></classpath>
</javac>
</target>
<target name="hibernate" depends="init">
<hibernatedoclet
destdir="${bin.dir}"
mergedir="${bin.dir}"
force="${bin.dir}"
excludedtags="@version,@author,@todo"
addedtags="@xdoclet-generated at ${TODAY},@copyright netone,@author roson,@version ${version}"
verbose="false"
>
<fileset dir="${src.dir}">
<include name="*.java"/>
</fileset>
<hibernate version="2.0"/>
</hibernatedoclet>
</target>
<target name="clean">
<delete dir="${bin.dir}"></delete>
</target>
</project>
build.xml文件通过ant来运行。首先 请确保ant能够运行,接着 打开 命令提示行(在运行那里输入cmd),转到上面结构所提的“项目目录”,直接输入 ant 就行。
注意:
最让我烦恼的就是 taskdef 部分。原因就是没有把所需要的jar包放进 lib 文件夹。并且要理解的是,它所需的classname="xdoclet.modules.hibernate.HibernateDocletTask" ,并不仅仅要求含有HibernateDocletTask.class这个文件的包,而是同时需要几个包同时存在。希望大家不要在犯同样的错误。
好了,大体就是这样了。可以参照http://www.hibernate.org/72.html。