在我的一篇“
用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
分享到:
相关推荐
使用XDoclet2生成hibernate映射文件的简单实例
NULL 博文链接:https://javatozhang.iteye.com/blog/2045875
XDoclet 与Hibernate 映射 目前,生成POJO的Hibernate映射文件主要有以下三种方式: ①.手动编码、 ②.由数据库导出配置文件、 ③.XDoclet根据POJO自动生成配置文件。
彻底搞定用Xdoclet生成Hibernate所有配置文件
XDoclet实现基本原理是,通过在Java代码加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件,
2.先写POJO类,然后映射文件,最后数据库 3.先映射文件,再同时生成POJO类和数据库 第1种 方法有背面向对象原理,而且控制起来不大方便,所以不推荐。 第2种 我认为思路会比较清楚,符合一般人思维习惯,但必须在...
在myeclipse中用xdoclet生成hbm文件
<property name="xdoclet.home" value="D:/jarpackage/xdoclet-plugins-1.0.3"/> 指出这个文件存放的位置.然后就可以使用了...里面有一个成功的例子 请读者参考 在构建域对象的时候一定要指明在配置文件中的配置信息...
利用XDoclet从Java持久化类生成hibernate mapping,hibernate.cfg.xml和mysql数据库脚本。
Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。...还有一个ddl2hbm,是根据数据库来导出表结构,并生成映射文件和POJO class。
其中包括xdoclet2与hibernate3.6的整合xdoclet1.2.3分别与spring3.0.5、struts1.3、struts2.1、 servlet的整合配置。其中还有相应的.xdt文件模板,其中struts2.1.xdt为自己写的。 需要xdoclet1.2.3 ...
可以让你创建自己 的javadoc @tags进而利用XDoclet中的Templet enging基于这些@tags生成源代码或其他文件(例如xml的deployment descriptors)。 XDoclet 继承了 JavaDoc 引擎的思想,允许根据定制 JavaDoc 标记...
博文链接:https://java-xiaodi.iteye.com/blog/143095
NULL 博文链接:https://penghuaiyi.iteye.com/blog/385817
附录C 用XDoclet工具生成映射文件 C.1 创建带有@hibernate标记的Java源文件 C.2 建立项目的目录结构 C.3 运行XDoclet工具 附录D 发布和运行netstore应用 D.1 运行netstore所需的软件 D.2 netstore...
8.2 根据数据库定义生成映射文件——MiddleGen 8.3 Hibernate官方工具 8.4 XDoclet-同步Hibernate基础代码 8.5 工具的使用周期 第9章 Hibernate XDoclet模板配置 9.1 IDEA 9.2 Eclipse 第10章 Hibernate益友...
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...
8.2 根据数据库定义生成映射文件——MiddleGen 8.3 Hibernate官方工具 8.4 XDoclet-同步Hibernate基础代码 8.5 工具的使用周期 第9章 Hibernate XDoclet模板配置 9.1 IDEA 9.2 Eclipse 第10章 Hibernate益友...