????? 在我的一篇“
用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腳本。開發環境如下:
????? 項目目錄結構如下:
????? 引用的jar列表如下:
????? 1. 新建一個Person實體類代碼如下:
這個類很簡單,很好理解,其中
?????? 2.新建ant腳本build.xml
?????? 下面對ant腳本解釋一下,這段
?????? 下面這段是一個編譯任務,相信大家都理解。
????? 下面的就是生成Mapping的任務了,比較主要的就是對Task的定義
其他的一些屬性可以參考 http://xdoclet.codehaus.org/HibernateMappingPlugin
????? 最后就是生成ddl數據庫腳本的任務,任務定義也很簡單
如下,這些是為SchemaExportTask任務提供的。
????? 下面是該任務的一些常用屬性:
要注意的地方是text屬性,如果你不想生成ddl數據庫腳本的同時還導入到數據庫,就把屬性值設為yes,否則你就必須得為hibernate配置數據庫連接的屬性(連接url,用戶名密碼等),如若不然就會拋
????? 3.測試結果
現在項目已經完成了,我們打開cmd,cd進入到build.xml文件所在的目錄,運行ant generator-mapping會生成Mapping文件,運行ant generator-schema就會生成ddl數據庫schema腳本。。當然不要忘記創建ANT_HOME環境變量并且把ant加入到path環境變量中..附件中有完整的工程。
?????? 在采用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環境變量中..附件中有完整的工程。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
