svn地址: http://xdocletdemo.googlecode.com/svn/trunk/

功能描述:

在ssh项目中,你是否存在着这样一种困惑,那就是需要手动去配置Hibernate的映射文件和配置文件。这个过程是相当痛苦的,需要写一大堆的的xml文件。Xdoclet就是为了简化这一工作的。它基于Ant或Maven,可以简化你的工作,使你在使用Hibernate时,不用在手动去为每个pojo类写对应的映射文件。当然你可以使用hibernate的注解完成同样的工作,但具体在ssh的项目中到底是选择注解方式还是选择配置方式,这完全取决于你自己或项目经理。关于是否采用注解还是配置文件的来方式来完成hibernate的映射,这个在网上有着很大的争议。这里我不做过多评价。个人更加倾向于使用配置文件。因为配置文件比较灵活,修改后不用重新编译成Java字节码文件,相反使用注解的话你需要及时的去编译。好了,话不多说,我们进入正题。

环境描述:

Eclipse3.6      http://eclipse.org

Ant1.7.1        http://ant.apache.org/

Xdoclet-1.2.3   http://xdoclet.sourceforge.net/xdoclet/index.html

Mysql5.0.22     http://www.mysql.com/

Hibernate3.X    http://www.hibernate.org/

WindowsXp sp3

温馨提示:这里重点需要说明一下此处Xdoclet版本为1.2.3,网上有一些关于Xdoclet的配置是基于1.0.4以前的版本。这两个版本之间存在着较大的区别,主要体现在Ant的构建文件build.xml中!请确保你的Xdoclet版本为1.2.3。

Eclipse的安装就不介绍了。

Ant安装:

将下载下来的Ant解压到一个目录(建议该目录不含空格),笔者解压到E:"JAR"apache-ant-1.7.1

Ant解压后的目录结构为:

设置环境变量:

要是Ant能够正常使用,我们需要设置环境变量(通常这是在Windows下)

设置ANT_HOME

修改Path

ANT_HOME

Path

查看环境变量是否设置正确

打开命令行窗口

输入set ANT_HOME查看ANT_HOME

输入set Path查看Path

设置正确后在命令行下输入ant

此时表示已将ant成功安装到操作系统中了,你可以使用ant的各种功能

Xdoclet-1.2.3安装

解压Xdoclet-1.2.3文件

笔者这里解压到E:"JAR"xdoclet"xdoclet-1.2.3

解压后的文件格式为:

这里需要记住xdoclet的解压路径E:"JAR"xdoclet"xdoclet-1.2.3,因为在Ant构建脚本中需要用到它

Mysql的安装不用介绍了,相信大家都不陌生。

准备Hibernate依赖的jar

打开eclipse,创建一个Java工程,名为xdoclet

在工程上右键添加一个名为build.xml的文件

在工程上右键添加一个名为lib的文件夹,拷贝hibernate依赖的jar包及mysql驱动,最后将该lib文件夹设置到classpath路径下

两个实体类一个为Group(组),一个为(User)

为了更好的显示日志信息,添加log4j.properties文件到src路径下

最后你看到的项目结构应该是这样的:

配置实体类

User.java

package com.xdoclet.model;

/**

* @hibernate.class

*     table="t_user"

* @author welcome

*

*/

publicclass User {

private String userId;

private String userName;

private Group group;

/**

* @hibernate.id column="userId"

* generator-class="assigned"

*/

public String getUserId() {

returnuserId;

}

publicvoid setUserId(String userId) {

this.userId = userId;

}

/**

* @hibernate.property

*/

public String getUserName() {

returnuserName;

}

publicvoid setUserName(String userName) {

this.userName = userName;

}

/**

* @hibernate.many-to-one

*     column="groupId"

*     cascade="all"

*     class="com.xdoclet.model.Group"

* @param group

*/

public Group getGroup() {

returngroup;

}

publicvoid setGroup(Group group) {

this.group = group;

}

}

Group.java

package com.xdoclet.model;

import java.util.Set;

/**

* @hibernate.class

*     table="t_group"

* @author welcome

*

*/

publicclass Group {

private String groupId;

private String groupName;

private Set userSets;

/**

* @hibernate.id

*     column="groupId"

*     generator-class="assigned"

* @return

*/

public String getGroupId() {

returngroupId;

}

publicvoid setGroupId(String groupId) {

this.groupId = groupId;

}

/**

* @hibernate.property

*     column="groupName"

* @return

*/

public String getGroupName() {

returngroupName;

}

publicvoid setGroupName(String groupName) {

this.groupName = groupName;

}

/**

* @hibernate.set inverse="true"

* @hibernate.collection-key column="groupId"

* @hibernate.collection-one-to-many

*     class="com.xdoclet.model.User"

* @return

*/

public Set getUserSets() {

returnuserSets;

}

publicvoid setUserSets(Set userSets) {

this.userSets = userSets;

}

}

注意:实体类中的注解,是xdoclet中的,这里不做解释,具体可以去查看xdoclet关于hibernate的相关文档

http://xdoclet.sourceforge.net/xdoclet/tags/hibernate-tags.html

log4j.properties配置文件详情

#All level less than INFO will be logged

log4j.rootLogger=INFO,A1

#A1 is the output device

log4j.appender.A1=org.apache.log4j.FileAppender

log4j.appender.A1.File=e:/log4j.htm

#use html layout

log4j.appender.A1.layout=org.apache.log4j.HTMLLayout

此文件会将日志信息记录为html格式的文件,然后输出到E盘下,html格式的日志信息看起来更加舒服。不信你可以去你目录下找找看。

最后我们来关注最重要的文件build.xml

<?xml version="1.0" encoding="UTF-8"?>

<projectname="使用xdoclet映射hibernate"basedir=".">

<!-- 定义源文件目录变量 -->

<propertyname="src.dir"value="${basedir}/src"/>

<!-- 定义xdoclet的目录 -->

<propertyname="xdoclet.home"value="E:/JAR/xdoclet/xdoclet-1.2.3"></property>

<!-- 定义构建路径 -->

<pathid="xdoclet.classpath">

<filesetdir="${xdoclet.home}/lib">

<includename="*.jar"/>

</fileset>

</path>

<pathid="lib.classpath">

<pathelementpath="${java.class.path}"/>

<filesetdir="${xdoclet.home}/lib">

<includename="**/*.jar"/>

</fileset>

<filesetdir="${basedir}/lib">

<includename="**/*.jar"/>

</fileset>

</path>

<!-- 生成Hibernate的映射文件 -->

<targetname="生成Hibernate的映射文件"unless="hibernatedoclet.unnecessary"

description="Generate Hibernate mapping files">

<taskdefname="hibernatedoclet"classname="xdoclet.modules.hibernate.HibernateDocletTask"

classpathref="xdoclet.classpath"/>

<hibernatedocletdestdir="${src.dir}"mergedir="${src.dir}"

excludedtags="@version,@author,@todo,@see"verbose="false">

<filesetdir="${src.dir}">

<includename="com/xdoclet/model/*.java"/>

</fileset>

<hibernateversion="3.0"/>

</hibernatedoclet>

</target>

<!-- 生成Hibernate配置文件 -->

<targetname="生成Hibernate配置文件"depends="生成Hibernate的映射文件">

<taskdefname="hibernatedoclet"classname="xdoclet.modules.hibernate.HibernateDocletTask"

classpathref="xdoclet.classpath"/>

<hibernatedocletdestdir="${src.dir}">

<filesetdir="${src.dir}">

<includename="com/xdoclet/model/*.java"/>

</fileset>

<hibernatecfgdestDir="${src.dir}"version="3.0"

hbm2ddl="create-update"jdbcUrl="jdbc:mysql://localhost:3306/xdoclet"

driver="com.mysql.jdbc.Driver"userName="root"password="root"

dialect="org.hibernate.dialect.MySQL5Dialect"showSql="true">

<otherPropertyname="hbm2ddl"value="create-update"/>

<otherPropertyname="format_sql"value="true"/>

</hibernatecfg>

</hibernatedoclet>

</target>

<!-- 导出数据库表结构 -->

<targetname="导出数据库表结构"depends="生成Hibernate配置文件">

<taskdefname="schemaexport"classname="org.hibernate.tool.hbm2ddl.SchemaExportTask"

classpathref="lib.classpath"/>

<propertyname="hibernate.dialect"value="org.hibernate.dialect.MySQL5Dialect"/>

<propertyname="hibernate.format_sql"value="true"/>

<propertyname="hibernate.use_sql_comments true"value="true"/>

<schemaexport

output="schema-export.sql"

quiet="no"

text="yes"

drop="no"

delimiter=";"

>

<filesetdir="${basedir}/src">

<includename="com/xdoclet/model/*.hbm.xml"/>

</fileset>

</schemaexport>

</target>

</project>

关于此文件不想做过多解释,细心的朋友可以自己去揣摩,前提是你要有ant的基础知识。

这里需要注意的是这两个元素

<otherProperty name="hbm2ddl" value="create-update" />

<otherProperty name="format_sql" value="true" />

在xdoclet1.0.4以后的版本中hbm2ddl需要以额外的方式来设置,之前我按照1.0.4版本中的方式去设置,此属性死活不会出现在hibernate.cfg.xml中,最后得知这是xdoclet的一个bug

详见:http://jira.codehaus.org/browse/MOJO-466

打开mysql,创建一个名为xdoclet的数据库

在eclipse中运行ant

点window->show view->ant

添加我们的ant脚本到eclipse的ant视图中

点击,选择build.xml文件

在导出数据库表结构上点击run as ant

此时控制台输出:

Buildfile: E:"JAR"jbpm"jbpm-4.3"workspace"xdoclet"build.xml

生成Hibernate的映射文件:

[hibernatedoclet] (XDocletMain.start                   47 ) Running <hibernate/>

[hibernatedoclet] Generating mapping file for com.xdoclet.model.Group.

[hibernatedoclet]    com.xdoclet.model.Group

[hibernatedoclet] Generating mapping file for com.xdoclet.model.User.

[hibernatedoclet]    com.xdoclet.model.User

生成Hibernate配置文件:

[hibernatedoclet] addOtherProperty(): name=null, null

[hibernatedoclet] addOtherProperty(): name=null, null

[hibernatedoclet] (XDocletMain.start                   47 ) Running <hibernatecfg/>

[hibernatedoclet] Generating hibernate.cfg.xml configuration file

导出数据库表结构:

[schemaexport] (cfg.Environment                     500 ) Hibernate 3.2.0

[schemaexport] (cfg.Environment                     533 ) hibernate.properties not found

[schemaexport] (cfg.Environment                     667 ) Bytecode provider name : cglib

[schemaexport] (cfg.Environment                     584 ) using JDK 1.4 java.sql.Timestamp handling

[schemaexport] (cfg.Configuration                   274 ) Reading mappings from file: E:"JAR"jbpm"jbpm-4.3"workspace"xdoclet"src"com"xdoclet"model"Group.hbm.xml

[schemaexport] (cfg.HbmBinder                       300 ) Mapping class: com.xdoclet.model.Group -> t_group

[schemaexport] (cfg.Configuration                   274 ) Reading mappings from file: E:"JAR"jbpm"jbpm-4.3"workspace"xdoclet"src"com"xdoclet"model"User.hbm.xml

[schemaexport] (cfg.HbmBinder                       300 ) Mapping class: com.xdoclet.model.User -> t_user

[schemaexport] (dialect.Dialect                     141 ) Using dialect: org.hibernate.dialect.MySQL5Dialect

[schemaexport] (cfg.HbmBinder                       2375) Mapping collection: com.xdoclet.model.Group.userSets -> t_user

[schemaexport] (hbm2ddl.SchemaExport                154 ) Running hbm2ddl schema export

[schemaexport] (hbm2ddl.SchemaExport                174 ) writing generated schema to file: E:"JAR"jbpm"jbpm-4.3"workspace"xdoclet"schema-export.sql

[schemaexport]

[schemaexport]     alter table t_user

[schemaexport]         drop

[schemaexport]         foreign key FKCB63CCB6CEAB0634;

[schemaexport]

[schemaexport]     drop table if exists t_group;

[schemaexport]

[schemaexport]     drop table if exists t_user;

[schemaexport]

[schemaexport]     create table t_group (

[schemaexport]         groupId varchar(255) not null,

[schemaexport]         groupName varchar(255),

[schemaexport]         primary key (groupId)

[schemaexport]     );

[schemaexport]

[schemaexport]     create table t_user (

[schemaexport]         userId varchar(255) not null,

[schemaexport]         userName varchar(255),

[schemaexport]         groupId varchar(255),

[schemaexport]         primary key (userId)

[schemaexport]     );

[schemaexport]

[schemaexport]     alter table t_user

[schemaexport]         add index FKCB63CCB6CEAB0634 (groupId),

[schemaexport]         add constraint FKCB63CCB6CEAB0634

[schemaexport]         foreign key (groupId)

[schemaexport]         references t_group (groupId);

[schemaexport] (hbm2ddl.SchemaExport                196 ) schema export complete

BUILD SUCCESSFUL

Total time: 1 second

再观察项目目录结构

是不是奇迹出现了?不错,我们做了一大堆工作要的就是这个结果

Group.hbm.xml文件内容

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping

>

<class

name="com.xdoclet.model.Group"

table="t_group"

>

<id

name="groupId"

column="groupId"

type="java.lang.String"

>

<generator class="assigned">

<!--

To add non XDoclet generator parameters, create a file named

hibernate-generator-params-Group.xml

containing the additional parameters and place it in your merge dir.

-->

</generator>

</id>

<property

name="groupName"

type="java.lang.String"

update="true"

insert="true"

column="groupName"

/>

<set

name="userSets"

lazy="false"

inverse="true"

cascade="none"

sort="unsorted"

>

<key

column="groupId"

>

</key>

<one-to-many

class="com.xdoclet.model.User"

/>

</set>

<!--

To add non XDoclet property mappings, create a file named

hibernate-properties-Group.xml

containing the additional properties and place it in your merge dir.

-->

</class>

</hibernate-mapping>

User.hbm.xml文件内容

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping

>

<class

name="com.xdoclet.model.User"

table="t_user"

>

<id

name="userId"

column="userId"

type="java.lang.String"

>

<generator class="assigned">

<!--

To add non XDoclet generator parameters, create a file named

hibernate-generator-params-User.xml

containing the additional parameters and place it in your merge dir.

-->

</generator>

</id>

<property

name="userName"

type="java.lang.String"

update="true"

insert="true"

column="userName"

/>

<many-to-one

name="group"

class="com.xdoclet.model.Group"

cascade="all"

outer-join="auto"

update="true"

insert="true"

column="groupId"

/>

<!--

To add non XDoclet property mappings, create a file named

hibernate-properties-User.xml

containing the additional properties and place it in your merge dir.

-->

</class>

</hibernate-mapping>

生成的hibernate.cfg.xml文件内容

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated file - Do not edit! -->

<hibernate-configuration>

<!-- a SessionFactory instance listed as /jndi/name -->

<session-factory>

<!-- properties -->

<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

<property name="show_sql">true</property>

<property name="use_outer_join">false</property>

<property name="connection.username">root</property>

<property name="connection.password">root</property>

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="connection.url">jdbc:mysql://localhost:3306/xdoclet</property>

<property name="hbm2ddl">create-update</property>

<property name="format_sql">true</property>

<!-- mapping files -->

<mapping resource="com/xdoclet/model/Group.hbm.xml"/>

<mapping resource="com/xdoclet/model/User.hbm.xml"/>

</session-factory>

</hibernate-configuration>

是不是跟预期的效果一样呢?

更为激动的是sql脚本

altertable t_user

drop

foreignkey FKCB63CCB6CEAB0634;

droptable if exists t_group;

droptable if exists t_user;

createtable t_group (

groupId varchar(255) notnull,

groupName varchar(255),

primarykey (groupId)

);

createtable t_user (

userId varchar(255) notnull,

userName varchar(255),

groupId varchar(255),

primarykey (userId)

);

altertable t_user

addindex FKCB63CCB6CEAB0634 (groupId),

addconstraint FKCB63CCB6CEAB0634

foreignkey (groupId)

references t_group (groupId);

紧接着就来介绍ExportTable.java文件

package com.xdoclet.export;

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

public class ExportTable {

public static void main(String[] args) {

Configuration configuration=new Configuration().configure("hibernate.cfg.xml");

SchemaExport export=new SchemaExport(configuration);

export.create(true, true);

}

}

很简单,一看就明白了,赶紧run一把吧!

查看生成的数据库表结构

T_user

T_group

哈哈,终于写完了。

现在你可以任意删除*.hbm.xml和hibernate.cfg.xml文件,只需重新运行ant就会再次生成*.hbm.xml和hibernate.cfg.xml文件,是不是很方便?

使用Xdoclet和Ant构建Hibernate映射和配置文件相关推荐

  1. 如何搭建aparche mysql_用Ant安装和构建Hibernate项目

    2 用Ant安装和构建项目 这一章包括: 获取和安装hibernate 安装和学习基本的Ant知识 建立和测试MySQL 使用Ant创建一个基本的项目 我们通过前面的示例认识到对开发者来说hibern ...

  2. 利用ant构建 jsp-servlet-class-jar

    [0]README 1)本文旨在 给出 利用ant构建 jsp->servlet->class->jar 的分析: 2)本文部分内容转自:http://zfsn.iteye.com/ ...

  3. Hibernate 映射文件

    转载 https://www.w3cschool.cn/hibernate/1vlx1iej.html Hibernate 映射文件 笔记 映射文件的主要作用:方便对数据库数据的处理,将数据库中每一个 ...

  4. Java 时间和日期类型的 Hibernate 映射

    以下情况下必须显式指定 Hibernate 映射类型 一个 Java 类型可能对应多个 Hibernate 映射类型. 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hi ...

  5. hibernate映射集合属性

    2019独角兽企业重金招聘Python工程师标准>>> hibernate映射集合属性通常需要指定一个name属性,用于标明该集合属性的名称: 除此之外,它还有如下可选属性:  ta ...

  6. 用MyEclipse自动生成hibernate映射文件和实体类

    创建web工程,使用Hibernate的时候,在工程里一个一个创建实体类太麻烦,浪费时间,现在教大家如何用MyEclipse自动生成Hibernate映射文件及实体类 方法/步骤 1 创建数据库,创建 ...

  7. 【SSH系列】Hibernate映射 -- 一对多关联映射

         映射原理        一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...

  8. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  9. 浅析Hibernate映射(一)——基本映射

    在说Hibernate映射之前,先下了解下面的概念. 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关 ...

最新文章

  1. Microsoft .NET Framework 4.6.1
  2. 每日一皮:男性同胞,是时候反击了!
  3. JimuReport积木报表,一个好用的开源免费的报表平台
  4. leetcode - 646. 最长数对链
  5. java hung_java – Hung JVM消耗100%的CPU
  6. 前端做聊天软件的功能难点
  7. Java终止线程的三种方式
  8. [转]Android编程之BitmapFactory.decodeResource加载图片缩小的原因及解决方法
  9. 2019.7.19刷题统计
  10. c语言获取栈可用大小,[求助]求教各位大神如何获得C语言函数体的大小?
  11. 第三方支付框架开发简要文档
  12. 隐式反馈的去噪,模型取得巨大提升!
  13. 嵌入式linux调节lcd背光,背光调节的软件设计 - 基于嵌入式Linux的LCD背光调节及驱动实现...
  14. SIGAR - System Information Gatherer And Reporter
  15. 2021年G3锅炉水处理考试内容及G3锅炉水处理模拟试题
  16. 怎么才算是高级点灯工程师?
  17. unity ios 应用名称多语言本地化
  18. Docker buil提示https://registry-1.docker.io/v2/: read tcp 10.221->:443: read: connection reset by peer
  19. SQL查询和分析跟踪 — SQL Server Profiler
  20. 風雷益 (易經大意 韓長庚)

热门文章

  1. 【Android CPU 优化】Android CPU 调优 ( Trace 文件分析 | Android Profiler 工具 | CPU Profiler 工具 )
  2. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )
  3. 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )
  4. PHP性能调优---PHP-FPM配置及使用总结
  5. stm32 输出PWM
  6. 线性表之链式存储结构
  7. 全景分割这一年,端到端之路
  8. 【TJOI/HEOI2016】求和
  9. SourceTree的基本使用
  10. 搜索Maven的仓库