`

使用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>
		<xdoclet>
			<fileset dir="${basedir}/src">
				<include name="**/entity/*.java"/>
			</fileset>
			<component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" destdir="${basedir}/src" version="3.0" encoding="UTF-8" force="true"/>
		</xdoclet>
	</target>
	<target name="generator-schema" depends="complie" description="生成schema文件">
			<taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="build.lib"></taskdef>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
		    <property name="hibernate.format_sql" value="true"/>
		    <property name="hibernate.use_sql_comments" value="true"/>
			<echo message="生成schema文件..."></echo>
			<schemaexport quiet="no" text="yes" drop="no" delimiter=";" output="${basedir}/src/ant-schema.sql">
				<fileset dir="${basedir}/src">
					<include name="**/entity/*.hbm.xml"/>
				</fileset>
			</schemaexport>
		</target>
</project>


       下面对ant脚本解释一下,这段
<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>
是定义一个classpath,这里一定记得把编译后的实体的class文件加入到classp里面否则在生成ddl的数据会报
引用
Schema text failed: Could not parse mapping document from file E:\workspace\ant\src\com\flysnow\domain\entity\Person.hbm.xml
的异常。这问异常困扰了我很久。
       下面这段是一个编译任务,相信大家都理解。
<target name="complie" description="编译">
		<javac srcdir="${basedir}/src" destdir="${basedir}/build/class">
			<classpath refid="build.lib"></classpath>
		</javac>
	</target>

      下面的就是生成Mapping的任务了,比较主要的就是对Task的定义
<taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="build.lib"></taskdef>
以及xdoclet的使用
<xdoclet>
			<fileset dir="${basedir}/src">
				<include name="**/entity/*.java"/>
			</fileset>
			<component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" destdir="${basedir}/src" version="3.0" encoding="UTF-8" force="true"/>
		</xdoclet>
其中比较新的就是component标记的使用了,这里其实就是以插件的形式引入对生成hibernate Mapping文件的支持,其主要属性有
  • version hibernate版本号,支持1.0,2.0和3.0
  • encoding 生成的Mapping文件的编码 默认是ISO-8859-1
  • force 是否每次都强制重新生成Mapping文件,默认为false,只有在实体的xdoclet标记改变的时候才重新生成。

其他的一些属性可以参考http://xdoclet.codehaus.org/HibernateMappingPlugin
      最后就是生成ddl数据库脚本的任务,任务定义也很简单
<taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="build.lib"></taskdef>
关键的几个需要配置的属性
如下,这些是为SchemaExportTask任务提供的。
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
		    <property name="hibernate.format_sql" value="true"/>
		    <property name="hibernate.use_sql_comments" value="true"/>

      下面是该任务的一些常用属性:
  • quiet 不要把脚本输出到stdout
  • drop 只进行drop tables的步骤
  • create 只创建表
  • text 不执行在数据库中运行的步骤
  • output 把输出的ddl脚本输出到一个文件
  • config 从XML文件读入Hibernate配置
  • properties 从文件读入数据库属性
  • format 把脚本中的SQL语句对齐和美化
  • delimiter 为脚本设置行结束符

要注意的地方是text属性,如果你不想生成ddl数据库脚本的同时还导入到数据库,就把属性值设为yes,否则你就必须得为hibernate配置数据库连接的属性(连接url,用户名密码等),如若不然就会抛
引用
java.lang.UnsupportedOperationException: The user must supply a JDBC connection
异常
      3.测试结果
现在项目已经完成了,我们打开cmd,cd进入到build.xml文件所在的目录,运行ant generator-mapping会生成Mapping文件,运行ant generator-schema就会生成ddl数据库schema脚本。。当然不要忘记创建ANT_HOME环境变量并且把ant加入到path环境变量中..附件中有完整的工程。
  • 大小: 6.2 KB
  • 大小: 5.5 KB
  • ant.rar (4.7 MB)
  • 下载次数: 336
分享到:
评论
3 楼 Wanghuidong 2010-12-27  
你有没有发现在生成的数据库脚本里面 字段的长度不对?你设定的是50 生成的确是255
2 楼 飞雪无情 2010-04-21  
endell 写道
楼主很细心啊,不错

呵呵。。都是实际中遇到的一些问题。。写出来给大家分享。。
1 楼 endell 2010-04-20  
楼主很细心啊,不错

相关推荐

    Hibernate使用xdoclet生成映射文件和sql语句

    这篇博客文章“Hibernate使用xdoclet生成映射文件和sql语句”可能详细介绍了如何结合这两个工具进行开发。 在早期的Java开发中,XDoclet是基于Javadoc注解的工具,它可以解析Java类中的特定注解,并根据这些注解...

    用maven的xdoclet插件t生成hibernate配置文件

    - `hibernate-hbm2ddl`:生成数据库脚本文件 #### 运行Ant脚本 在完成实体类设计及Ant脚本编写后,可以通过命令行运行Ant脚本来生成所需的配置文件。例如,在项目根目录下执行以下命令: ```sh ant generate ``` ...

    XDoclet 与Hibernate 映射

    XDoclet 是一款强大的Java注解处理工具,它允许开发者在Java源代码中添加元数据,这些元数据可以用来自动生成各种配置文件,包括Hibernate的映射文件(hbm.xml)。这种方式极大地提高了开发效率,避免了手动创建和...

    XDoclet2辅助开发hibernate3

    为了解决这个问题,XDoclet应运而生,特别是XDoclet2版本,它是一种自动化工具,能够根据Java源代码自动生成包括Hibernate映射文件在内的多种元数据文件。 XDoclet2是XDoclet的升级版,它基于JavaDoc注解,提供了一...

    pojo+xDoclet生成ibatis映射文件

    为了使 XDoclet 能够正确生成 iBatis 的 SQL 映射文件,还需要在构建脚本中配置相应的任务。这里以 Ant 构建工具为例: ```xml &lt;path id="xdoclet.path"&gt; ${xdocletlib}"&gt; *.jar"/&gt; &lt;taskdef classname="...

    Xdoclet入门基础教程

    * 生成 Hibernate 映射文件:Xdoclet 可以生成 Hibernate 映射文件,用于配置数据库表和 Java 类之间的关系。 * 生成 JavaDoc 文档:Xdoclet 可以生成 JavaDoc 文档,用于描述 Java 类和方法的信息。 * 自动生成配置...

    Xdoclet生成*.hbm.xml映射文件

    随着Hibernate的发展,它推荐使用注解(Annotation)直接在Java类上进行ORM配置,取代了Xdoclet生成映射文件的方式。因此,尽管Xdoclet仍有一定的实用性,但在现代开发环境中,直接使用Hibernate注解已成为主流。 ...

    xdoclet 生成hbm文件

    《XDoclet 生成 Hibernate 映射文件(HBM)详解》 在Java开发中,尤其是在使用Hibernate框架进行持久化操作时,通常需要为每个Java实体类编写对应的Hibernate映射文件(HBM)。然而,手动编写这些XML文件既耗时又...

    Ant结合Xdoclet 实例教程(之整合 Hibernate)

    4. **生成映射文件**:运行Ant脚本,它会根据源代码中的Javadoc注释自动生成Hibernate映射文件。 5. **配置Hibernate**:在hibernate.cfg.xml文件中,指定生成的映射文件路径,并配置数据库连接信息。 6. **构建...

    Ant+XDoclet生成hbm文件

    本篇文章将详细介绍如何使用Ant和XDoclet来生成Hibernate的HBM(Hibernate Mapping)文件。 首先,Ant是一个基于Java的构建工具,它允许开发者通过XML配置文件来定义构建过程,包括编译、打包、测试等任务。Ant的...

    XDoclet插件包以及从Java持久化类生成hibernate mapping小例子

    总结起来,这个例子展示了如何利用XDoclet插件从Java持久化类自动生成功能强大的Hibernate映射文件和数据库脚本,极大地简化了开发过程,提高了代码的可维护性。通过这种方式,开发者可以更专注于业务逻辑,而非重复...

    Java Open Source Programming with XDoclet JUnit WebWork Hibernate

    1. **XDoclet**:XDoclet是一款基于JavaDoc的代码生成工具,它可以自动从Java源代码中的注释生成各种元数据,如Java EE的部署描述符、Hibernate的映射文件等。通过使用XDoclet,开发者可以避免手动编写这些重复性的...

    xdoclet 用于生成*.hbm.xml

    xdoclet是一款强大的Java文档注解处理器,它在Java源代码中通过特定的注解(annotations)来自动生成各种配置文件,极大地简化了开发过程,尤其是对于Hibernate等持久层框架的使用者。标题提到的"xdoclet 用于生成*....

    新建 Micro用ant执行POJO自动生成映射文件及数据表soft Word 文档

    2. **先写POJO类**:这种方式首先定义好Java对象,再通过工具生成映射文件并最终生成数据库表。这种做法更符合面向对象的设计思想,便于代码管理和维护,但需要在POJO类中添加大量的Xdoclet注释来指导映射文件的生成...

    使用xDoclet自动生成Spring的bean的配置文件

    在博文《使用xDoclet自动生成Spring的bean的配置文件》中,作者可能详细介绍了如何配置和使用xDoclet。这可能包括以下几个步骤: 1. **安装xDoclet**:下载xDoclet库并将其添加到项目的构建路径中,如果是Maven项目...

    为xdoclet添加hibernate智能提示

    XDoclet通过解析Java源文件中的JavaDoc注释,根据预定义的模板生成相应的代码,如Hibernate的映射文件(.hbm.xml)和DAO层的Java代码。因此,要实现对Hibernate的智能提示,我们需要在项目的XDoclet配置中指定...

    Hibernate配置文件中映射元素详解

    hibernate.hbm2ddl.auto=update ``` 总之,Hibernate的配置文件是实现Java对象与数据库表之间映射的关键,其中包含了许多元素,如`&lt;class&gt;`、`&lt;id&gt;`、`&lt;property&gt;`、`&lt;component&gt;`等,这些元素共同构成了ORM的核心...

Global site tag (gtag.js) - Google Analytics