????? 在我的一篇“
用Xdoclet由POJOt生成hbm文件時不能生成meta注釋的問題
”中介紹了采用xdoclet1生成hibernate映射文件的一些問題,這里不再提了,有興趣的朋友可以看一下。
?????? 在采用xdoclet1生成了帶meta標(biāo)記的注釋后問題依然沒有斷,在使用hibernate的SchemaExportTask生成ddl數(shù)據(jù)庫腳本的時候發(fā)現(xiàn)生成的腳本都沒有注釋,就是字段或者表后面加上comment定義( 如:MZ varchar(255) comment '名字', 以mysql為例 ),查找原因,原來是我用的hibernate版本(hibernate3.2.7)有點(diǎn)高,這時的hibernate開始支持comment標(biāo)記生成注釋了,不再支持meta啦。當(dāng)然如果替換成hibernate3.1版本的是可以生成注釋的。。
??????? 這里我不準(zhǔn)備使用hibernate3.1,但是xdoclet1不支持@hibernate.comment生成<comment>名字</comment>標(biāo)記的生成,無奈放棄xdoclet1,使用xdoclet2。
xdoclet2對hibernate的支持非常的好,所有的標(biāo)簽都有了,可以像使用hibernate標(biāo)記一樣使用它們,xdoclet2的hibernateTag參見 http://xdoclet.codehaus.org/HibernateTags 。下面就是用xdoclet2演示一下生成hibernate3映射文件進(jìn)而生成ddl數(shù)據(jù)庫schema腳本。開發(fā)環(huán)境如下:
????? 項(xiàng)目目錄結(jié)構(gòu)如下:
????? 引用的jar列表如下:
????? 1. 新建一個Person實(shí)體類代碼如下:
這個類很簡單,很好理解,其中
?????? 2.新建ant腳本build.xml
?????? 下面對ant腳本解釋一下,這段
?????? 下面這段是一個編譯任務(wù),相信大家都理解。
????? 下面的就是生成Mapping的任務(wù)了,比較主要的就是對Task的定義
其他的一些屬性可以參考 http://xdoclet.codehaus.org/HibernateMappingPlugin
????? 最后就是生成ddl數(shù)據(jù)庫腳本的任務(wù),任務(wù)定義也很簡單
如下,這些是為SchemaExportTask任務(wù)提供的。
????? 下面是該任務(wù)的一些常用屬性:
要注意的地方是text屬性,如果你不想生成ddl數(shù)據(jù)庫腳本的同時還導(dǎo)入到數(shù)據(jù)庫,就把屬性值設(shè)為yes,否則你就必須得為hibernate配置數(shù)據(jù)庫連接的屬性(連接url,用戶名密碼等),如若不然就會拋
????? 3.測試結(jié)果
現(xiàn)在項(xiàng)目已經(jīng)完成了,我們打開cmd,cd進(jìn)入到build.xml文件所在的目錄,運(yùn)行ant generator-mapping會生成Mapping文件,運(yùn)行ant generator-schema就會生成ddl數(shù)據(jù)庫schema腳本。。當(dāng)然不要忘記創(chuàng)建ANT_HOME環(huán)境變量并且把a(bǔ)nt加入到path環(huán)境變量中..附件中有完整的工程。
?????? 在采用xdoclet1生成了帶meta標(biāo)記的注釋后問題依然沒有斷,在使用hibernate的SchemaExportTask生成ddl數(shù)據(jù)庫腳本的時候發(fā)現(xiàn)生成的腳本都沒有注釋,就是字段或者表后面加上comment定義( 如:MZ varchar(255) comment '名字', 以mysql為例 ),查找原因,原來是我用的hibernate版本(hibernate3.2.7)有點(diǎn)高,這時的hibernate開始支持comment標(biāo)記生成注釋了,不再支持meta啦。當(dāng)然如果替換成hibernate3.1版本的是可以生成注釋的。。
??????? 這里我不準(zhǔn)備使用hibernate3.1,但是xdoclet1不支持@hibernate.comment生成<comment>名字</comment>標(biāo)記的生成,無奈放棄xdoclet1,使用xdoclet2。
xdoclet2對hibernate的支持非常的好,所有的標(biāo)簽都有了,可以像使用hibernate標(biāo)記一樣使用它們,xdoclet2的hibernateTag參見 http://xdoclet.codehaus.org/HibernateTags 。下面就是用xdoclet2演示一下生成hibernate3映射文件進(jìn)而生成ddl數(shù)據(jù)庫schema腳本。開發(fā)環(huán)境如下:
- Eclipse3.4
- jdk5.0.20
- ant1.7.0(Eclipse自帶的)
- xdoclet-plugins(即xdoclet2) 下載地址
- hibernate3.2.7ga
????? 項(xiàng)目目錄結(jié)構(gòu)如下:

????? 引用的jar列表如下:

????? 1. 新建一個Person實(shí)體類代碼如下:
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;//標(biāo)識 private String name;//名字 private Integer age;//年齡 /** * @hibernate.id generator-class="native" * @hibernate.column name="ID" comment="標(biāo)識" */ 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中對實(shí)體類的注釋標(biāo)記,而
@hibernate.column name="ID" comment="標(biāo)識"則是對字段的注釋標(biāo)記,生成dll數(shù)據(jù)庫腳本就是對表和列的注釋說明。
?????? 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,這里一定記得把編譯后的實(shí)體的class文件加入到classp里面否則在生成ddl的數(shù)據(jù)會報
引用
Schema text failed: Could not parse mapping document from file E:\workspace\ant\src\com\flysnow\domain\entity\Person.hbm.xml
的異常。這問異常困擾了我很久。
?????? 下面這段是一個編譯任務(wù),相信大家都理解。
<target name="complie" description="編譯"> <javac srcdir="${basedir}/src" destdir="${basedir}/build/class"> <classpath refid="build.lib"></classpath> </javac> </target>
????? 下面的就是生成Mapping的任務(wù)了,比較主要的就是對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標(biāo)記的使用了,這里其實(shí)就是以插件的形式引入對生成hibernate Mapping文件的支持,其主要屬性有
- version hibernate版本號,支持1.0,2.0和3.0
- encoding 生成的Mapping文件的編碼 默認(rèn)是ISO-8859-1
- force 是否每次都強(qiáng)制重新生成Mapping文件,默認(rèn)為false,只有在實(shí)體的xdoclet標(biāo)記改變的時候才重新生成。
其他的一些屬性可以參考 http://xdoclet.codehaus.org/HibernateMappingPlugin
????? 最后就是生成ddl數(shù)據(jù)庫腳本的任務(wù),任務(wù)定義也很簡單
<taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="build.lib"></taskdef>關(guān)鍵的幾個需要配置的屬性
如下,這些是為SchemaExportTask任務(wù)提供的。
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/>
????? 下面是該任務(wù)的一些常用屬性:
- quiet 不要把腳本輸出到stdout
- drop 只進(jìn)行drop tables的步驟
- create 只創(chuàng)建表
- text 不執(zhí)行在數(shù)據(jù)庫中運(yùn)行的步驟
- output 把輸出的ddl腳本輸出到一個文件
- config 從XML文件讀入Hibernate配置
- properties 從文件讀入數(shù)據(jù)庫屬性
- format 把腳本中的SQL語句對齊和美化
- delimiter 為腳本設(shè)置行結(jié)束符
要注意的地方是text屬性,如果你不想生成ddl數(shù)據(jù)庫腳本的同時還導(dǎo)入到數(shù)據(jù)庫,就把屬性值設(shè)為yes,否則你就必須得為hibernate配置數(shù)據(jù)庫連接的屬性(連接url,用戶名密碼等),如若不然就會拋
引用
java.lang.UnsupportedOperationException: The user must supply a JDBC connection
異常
????? 3.測試結(jié)果
現(xiàn)在項(xiàng)目已經(jīng)完成了,我們打開cmd,cd進(jìn)入到build.xml文件所在的目錄,運(yùn)行ant generator-mapping會生成Mapping文件,運(yùn)行ant generator-schema就會生成ddl數(shù)據(jù)庫schema腳本。。當(dāng)然不要忘記創(chuàng)建ANT_HOME環(huán)境變量并且把a(bǔ)nt加入到path環(huán)境變量中..附件中有完整的工程。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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