亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用XDoclet2生成hibernate映射文件進(jìn)而生成數(shù)

系統(tǒng) 1620 0
????? 在我的一篇“ 用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)境如下:
  • Eclipse3.4
  • jdk5.0.20
  • ant1.7.0(Eclipse自帶的)
  • xdoclet-plugins(即xdoclet2) 下載地址
  • hibernate3.2.7ga

????? 項(xiàng)目目錄結(jié)構(gòu)如下:

使用XDoclet2生成hibernate映射文件進(jìn)而生成數(shù)據(jù)庫ddl腳本
????? 引用的jar列表如下:
使用XDoclet2生成hibernate映射文件進(jìn)而生成數(shù)據(jù)庫ddl腳本

????? 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)境變量中..附件中有完整的工程。

使用XDoclet2生成hibernate映射文件進(jìn)而生成數(shù)據(jù)庫ddl腳本


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 99国产精品免费观看视频 | 91精品国产高清久久久久 | 久久久精品午夜免费不卡 | 国产精品亚欧美一区二区三区 | 精品久久久久久中文字幕欧美 | 欧美刺激午夜性久久久久久久 | 色国产在线| 99久久这里只有精品 | 国产在线拍揄自揄视频不卡99 | 国产精品中文字幕在线 | 亚洲综合综合在线 | 日韩美女中文字幕 | 国产激情一区二区三区 | 久久国产影视免费精品 | 国产高清一级视频在线观看 | 久久久久久久国产高清 | 男人午夜免费视频 | 久久成人午夜 | 国产精品爱久久久久久久小 | 亚洲午夜久久久久国产 | 免费看色 | 久久99精品久久久久久国产人妖 | 成人黄色在线 | 国产在线看片护士免费视频 | 手机看片日韩高清国产欧美 | 国产精品资源站 | 毛片大全高清免费 | 久久国产精品免费视频 | 欧美一级高清片欧美国产欧美 | 国产国语一级毛片中文 | 国内久久久久影院精品 | 亚洲国产精品yw在线观看 | 国产精品久久精品福利网站 | 欧美精品免费在线 | 国产一区二区三区四区在线 | 久草视频国产 | 神马影院我不卡手机版 | 亚洲综合区小说区激情区噜噜 | 奇米一区 | 亚洲精品tv久久久久久久久久 | 国产真实伦视频在线观看 |