日期:2014-05-16  浏览次数:20442 次

使用XDoclet2生成hibernate映射文件进而生成数据库ddl脚本
      在我的一篇“用Xdoclet由POJOt生成hbm文件时不能生成meta注释的问题”中介绍了采用xdoclet1生成hibernate映射文件的一些问题,这里不再提了,有兴趣的朋友可以看一下。
       在采用xdoclet1生成了带meta标记的注释后问题依然没有断,在使用hibernate的SchemaExportTask生成ddl数据库脚本的时候发现生成的脚本都没有注释,就是字段或者表后面加上comment定义(如:MZ varchar(255) comment '名字', 以mysql为例),查找原因,原来是我用的hibernate版本(hibernate3.2.7)有点高,这时的hibernate开始支持comment标记生成注释了,不再支持meta啦。当然如果替换成hibernate3.1版本的是可以生成注释的。。
        这里我不准备使用hibernate3.1,但是xdoclet1不支持@hibernate.comment生成<comment>名字</comment>标记的生成,无奈放弃xdoclet1,使用xdoclet2。
xdoclet2对hibernate的支持非常的好,所有的标签都有了,可以像使用hibernate标记一样使用它们,xdoclet2的hibernateTag参见http://xdoclet.codehaus.org/HibernateTags。下面就是用xdoclet2演示一下生成hibernate3映射文件进而生成ddl数据库schema脚本。开发环境如下:
  • Eclipse3.4
  • jdk5.0.20
  • ant1.7.0(Eclipse自带的)
  • xdoclet-plugins(即xdoclet2)下载地址
  • hibernate3.2.7ga

      项目目录结构如下:


      引用的jar列表如下:


      1.新建一个Person实体类代码如下:
package com.flysnow.domain.entity;

import java.io.Serializable;

/**
 * @author 飞雪无情
 * @since:2010-2-20
 */
/**
 * @hibernate.mapping default-lazy="false"
 * @hibernate.class table="t_person"
 * @hibernate.comment 人
 */
public class Person implements Serializable {
	private static final long serialVersionUID = 6422096732289758030L;
	private Long id;//标识
	private String name;//名字
	private Integer age;//年龄
	/**
	 * @hibernate.id generator-class="native"
	 * @hibernate.column name="ID" comment="标识"
	 */
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	/**
	 * @hibernate.property type="string" length="50" not-null="true"
	 * @hibernate.column name="MZ"comment="名字"
	 */
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @hibernate.property type="integer" not-null="true"
	 * @hibernate.column name="NL" comment="年龄"
	 */
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

}

这个类很简单,很好理解,其中
@hibernate.comment 人
就是xdoclet2中对实体类的注释标记,而
@hibernate.column name="ID" comment="标识"
则是对字段的注释标记,生成dll数据库脚本就是对表和列的注释说明。
       2.新建ant脚本build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- ====================================================================== 
     2010-2-20 下午02:45:02                                                        

     project    
     description
                   
     飞雪无情                                                                
     ====================================================================== -->
<project name="project" default="generator-schema" basedir=".">
	<path id="build.lib">
		<fileset dir="${basedir}/lib">
			<include name="**/*.jar"/>
		</fileset>
		<fileset dir="${basedir}/lib/xdoclet">
			<include name="**/*.jar"/>
		</fileset>
		<pathelement location="${basedir}/build/class"/>
	</path>
	<target name="complie" description="编译">
		<javac srcdir="${basedir}/src" destdir="${basedir}/build/class">
			<classpath refid="build.lib"></classpath>
		</javac>
	</target>
	<target name="generator-mapping" description="生成Mapping文件">
		<taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="build.lib"></taskdef>
		<echo message="生成Mapping文件..."></echo>
		<xdocle