這裏將利用xdoclet來爲hibernate生成相關代碼(由Customer.java生成Customer.hbm.xml),看看xdoclet對提供工作效率的。
一 運行環境:
1、xdoclet
2、ant
3、hibernate
需要的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。