用ant和xdoclet生成hibernate配置文件可以为我们省去很多配置的操作,废话不多说,直接给栗子:

测试环境:

eclipse:Eclipse Java EE IDE for Web Developers 4.6.0

ant:eclipse自带ant,无需下载配置

xdoclet:xdoclet-1.2.3

hibernate:hibernate-distribution-3.3.2.GA-dist + hibernate-annotations-3.4.0.GA(由于是老版本所以是有两个的)

1,、配置xdoclet

首先解压下载好的xdoclet1.2.3:

Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件_java


打开eclipse,进入window》preferences》javaEE》XDoclet,选择xdoclet版本 Version:1.2.3(自带ant只支持1.2.1-1.2.3)和XDoclet Home:点击浏览选择刚才安装的xdoclet根路径,这里是:E:\softwareForJava\xdoclet\xdoclet-1.2.3 ,点击OK,如下图

Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件_hibernate_02


2.示例程序

创建一个java project:xdocletTest。

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

在工程上右键添加一个名为lib的文件夹,把hibernate依赖的jar包及mysql驱动jar包都放到lib文件夹下

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

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

(1)配置实体类

User.java


[java]​view plain​​copy​


  1. package com.xdoclet.model;  

  2. /** 

  3.  * @hibernate.class 

  4.  *     table="t_user" 

  5.  * @author welcome 

  6.  */  

  7. public class User {  

  8.     private String userId;  

  9.     private String userName;  

  10.     private Group group;  

  11.     /** 

  12.      * @hibernate.id column="userId" 

  13.      * generator-class="assigned" 

  14.      */  

  15.     public String getUserId() {  

  16.        return userId;  

  17.     }  

  18.     public void setUserId(String userId) {  

  19.        this.userId = userId;  

  20.     }  

  21.     /** 

  22.      * @hibernate.property 

  23.      */  

  24.     public String getUserName() {  

  25.        return userName;  

  26.     }  

  27.     public void setUserName(String userName) {  

  28.        this.userName = userName;  

  29.     }  

  30.     /** 

  31.      * @hibernate.many-to-one 

  32.      *     column="groupId" 

  33.      *     cascade="all" 

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

  35.      * @param group 

  36.      */  

  37.     public Group getGroup() {  

  38.        return group;  

  39.     }  

  40.     public void setGroup(Group group) {  

  41.        this.group = group;  

  42.     }  

  43. }  


Group.java


[java]​view plain​​copy​


  1. package com.xdoclet.model;  

  2. import java.util.Set;  

  3. /** 

  4.  * @hibernate.class 

  5.  *     table="t_group" 

  6.  * @author welcome 

  7.  */  

  8. public class Group {  

  9.     private String groupId;  

  10.     private String groupName;  

  11.     private Set userSets;  

  12.     /** 

  13.      * @hibernate.id 

  14.      *     column="groupId" 

  15.      *     generator-class="assigned" 

  16.      * @return 

  17.      */  

  18.     public String getGroupId() {  

  19.        return groupId;  

  20.     }  

  21.     public void setGroupId(String groupId) {  

  22.        this.groupId = groupId;  

  23.     }  

  24.     /** 

  25.      * @hibernate.property 

  26.      *     column="groupName" 

  27.      * @return 

  28.      */  

  29.     public String getGroupName() {  

  30.        return groupName;  

  31.     }  

  32.     public void setGroupName(String groupName) {  

  33.        this.groupName = groupName;  

  34.     }  

  35.     /** 

  36.      * @hibernate.set inverse="true" 

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

  38.      * @hibernate.collection-one-to-many 

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

  40.      * @return 

  41.      */  

  42.     public Set getUserSets() {  
  43.        return userSets;  

  44.     }  

  45.     public void setUserSets(Set userSets) {  

  46.        this.userSets = userSets;  

  47.     }  

  48. }  


注意:实体类中的注解是xdoclet的,可以去查看xdoclet关于hibernate的相关文档​​http://xdoclet.sourceforge.net/xdoclet/tags/hibernate-tags.html​


(2)log4j.properties配置文件


[html]​view plain​​copy​


  1. #All level less than INFO will be logged  

  2. log4j.rootLogger=INFO,A1  

  3. #A1 is the output device  

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

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

  6. #use html layout  

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


此文件会将日志信息记录为html格式的文件,然后输出到E盘下。


(3)build.xml


[html]​view plain​​copy​


  1. <span style="font-size:14px;"><?xml version="1.0" encoding="GBK"?>  
  2. <project name="使用xdoclet映射hibernate" basedir=".">  

  3.     <!-- 定义源文件目录变量 -->  
  4.     <property name="src.dir" value="${basedir}/src" />  

  5.     <!-- 定义xdoclet的目录 -->  
  6.     <property name="xdoclet.home" value="E:\softwareForJava\xdoclet\xdoclet-1.2.3">  
  7.     </property>  

  8.     <!-- 定义构建路径 -->  
  9.     <path id="xdoclet.classpath">  
  10.         <fileset dir="${xdoclet.home}/lib">  
  11.             <include name="*.jar" />  
  12.         </fileset>  
  13.     </path>  

  14.     <path id="lib.classpath">   
  15.         <fileset dir="${xdoclet.home}/lib">  
  16.             <include name="**/*.jar" />  
  17.         </fileset>  
  18.         <fileset dir="${basedir}/lib">  
  19.             <include name="**/*.jar" />  
  20.         </fileset>      
  21.     </path>  

  22.     <!-- 生成Hibernate的映射文件 -->  
  23.     <target name="生成Hibernate的映射文件" unless="hibernatedoclet.unnecessary" description="Generate Hibernate mapping files">  
  24.         <taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="xdoclet.classpath" />  
  25.         <hibernatedoclet destdir="${src.dir}" mergedir="${src.dir}" excludedtags="@version,@author,@todo,@see" verbose="false">  
  26.             <fileset dir="${src.dir}">  
  27.                 <include name="com/xdoclet/model/*.java" />  
  28.             </fileset>  
  29.             <hibernate version="3.0" />  
  30.         </hibernatedoclet>  
  31.     </target>  

  32.     <!-- 生成Hibernate配置文件 -->  
  33.     <target name="生成Hibernate配置文件" depends="生成Hibernate的映射文件">  
  34.         <taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="xdoclet.classpath" />  
  35.         <hibernatedoclet destdir="${src.dir}">  
  36.             <fileset dir="${src.dir}">  
  37.                 <include name="com/xdoclet/model/*.java" />  
  38.             </fileset>  
  39.             <hibernatecfg destdir="${src.dir}" version="3.0" hbm2ddl="create-update" jdbcUrl="jdbc:mysql://localhost:3306/oa" driver="com.mysql.jdbc.Driver" username="root" password="123456" dialect="org.hibernate.dialect.MySQL5Dialect" showSql="true">  
  40.                 <otherProperty name="hbm2ddl" value="create-update" />  
  41.                 <otherProperty name="format_sql" value="true" />  
  42.             </hibernatecfg>  
  43.         </hibernatedoclet>  
  44.     </target>  

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

  46.     <target name="导出数据库表结构" depends="生成Hibernate配置文件">  
  47.         <taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="lib.classpath" />  
  48.         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />  
  49.         <property name="hibernate.format_sql" value="true" />  
  50.         <property name="hibernate.use_sql_comments" value="true" />  
  51.         <schemaexport output="schema-export.sql" quiet="no" text="yes" drop="no" delimiter=";">  
  52.             <fileset dir="${basedir}/src">  
  53.                 <include name="com/xdoclet/model/*.hbm.xml" />  
  54.             </fileset>  
  55.         </schemaexport>  
  56.     </target>  
  57. </project></span>  


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

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

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

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


(4)ExportTable.java (生成数据库表结构)


[java]​view plain​​copy​


  1. package com.xdoclet.export;  

  2. import org.hibernate.cfg.Configuration;  

  3. import org.hibernate.tool.hbm2ddl.SchemaExport;  

  4. public class ExportTable {  

  5.     public static void main(String[] args) {  

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

  7.        SchemaExport export=new SchemaExport(configuration);  

  8.        export.create(truetrue);  

  9.     }  

  10. }  

此处需要导入hibernate的jar包和MySQL驱动包


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

Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件_hibernate_03


3.生成配置文件

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

在eclipse中运行ant:点window->show view->ant,添加我们的ant脚本到eclipse的ant视图中,右键ant视图空白处或者点击下图位置添加构建脚本:

Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件_mysql_04

选择build.xml文件,在”导出数据库表结构“上点击run as ant

此时控制台输出:


[plain]​view plain​​copy​


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

  2. 生成Hibernate的映射文件:  

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

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

  5. [hibernatedoclet]    com.xdoclet.model.Group  

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

  7. [hibernatedoclet]    com.xdoclet.model.User  

  8. 生成Hibernate配置文件:  

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

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

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

  12. [hibernatedoclet] Generating hibernate.cfg.xml configuration file  

  13. 导出数据库表结构:  

  14. [schemaexport] (cfg.Environment                     500 ) Hibernate 3.2.0  

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

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

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

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

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

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

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

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

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

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

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

  26. [schemaexport]  

  27. [schemaexport]     alter table t_user  

  28. [schemaexport]         drop  

  29. [schemaexport]         foreign key FKCB63CCB6CEAB0634;  

  30. [schemaexport]  

  31. [schemaexport]     drop table if exists t_group;  

  32. [schemaexport]  

  33. [schemaexport]     drop table if exists t_user;  

  34. [schemaexport]  

  35. [schemaexport]     create table t_group (  

  36. [schemaexport]         groupId varchar(255) not null,  

  37. [schemaexport]         groupName varchar(255),  

  38. [schemaexport]         primary key (groupId)  

  39. [schemaexport]     );  

  40. [schemaexport]  

  41. [schemaexport]     create table t_user (  

  42. [schemaexport]         userId varchar(255) not null,  

  43. [schemaexport]         userName varchar(255),  

  44. [schemaexport]         groupId varchar(255),  

  45. [schemaexport]         primary key (userId)  

  46. [schemaexport]     );  

  47. [schemaexport]  

  48. [schemaexport]     alter table t_user  

  49. [schemaexport]         add index FKCB63CCB6CEAB0634 (groupId),  

  50. [schemaexport]         add constraint FKCB63CCB6CEAB0634  

  51. [schemaexport]         foreign key (groupId)  

  52. [schemaexport]         references t_group (groupId);  

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

  54. BUILD SUCCESSFUL  

  55. Total time: 1 second  


此时再刷新工程目录,就会发现已经生成了hibernate的配置文件和映射文件,而且sql 脚本竟然也生成了!最后如下:

Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件_hibernate_05


再运行ExportTable.java(运行之前要先build path导入hibernate的jar包和MySQL驱动jar包),就生成了数据库表结构了,赶紧打开MySQL看一下吧!