Sung in Blog

                     一些技術(shù)文章 & 一些生活雜碎
          ?

          使用Hibernate的一個不便之處就是要維護數(shù)據(jù)庫schema,hbm文件和java文件的一致性,而Middlegen可以幫助你完成這些。

          Middlegen是一個基于Xdoclet的代碼,配置文件自動生成工具。它支持目前流行的大部分的技術(shù),例如EJB,JDO,Hibernate,Torque,JSP/Struts等。

          Middlegen主要根據(jù)你已有的數(shù)據(jù)庫Schema根據(jù)你的要求來自動的生成你所需要的文件,這大大的降低了開發(fā)難度,提高了開發(fā)速度。使用Middlegen的另一個顯而易見的好處是你所有的代碼可以在一分鐘之內(nèi)和數(shù)據(jù)庫同步。

          使用Middlegen自動的生成Hbm文件和Java文件包括兩步,第一,根據(jù)數(shù)據(jù)庫Schema生成Hbm文件。第二,根據(jù)hbm文件生成與之對應(yīng)得Java文件,這些文件主要是與數(shù)據(jù)庫表對應(yīng)得持久化類。Middlegen的主要功能都必須在ant環(huán)境下使用,下述build文件片斷說明了如何定義自定義的任務(wù)(task

          name="middlegen"

          classname="middlegen.MiddlegenTask"

          classpathref="classpath.path"/>

          ????? ?? name="hbm2java"

          ????? ?? classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"

          ????? ?? classpathref="classpath.path"/>

          其中第一個taskdef定義了用于根據(jù)數(shù)據(jù)庫schema生成hbm文件的自定義任務(wù)(middlegen)。第二個taskdef定義了用于使用hbm文件自動生成持久化Java文件的自定義任務(wù)(hbm2java)。其中要說明的是classpath.path指定的路徑下必須包含middlegen攜帶的jar文件和hibernate攜帶的jar文件。

          使用自定義任務(wù)來生成hbm文件:

          name="middlegen"

          classname="middlegen.MiddlegenTask"

          classpathref="classpath.path"/>

          ??? ????

          ????? ?????????? prefsdir="${conf.dir}"

          ???? ??????????? gui="false"

          ????? ?????????? databaseurl="${config.database.url}"

          ????? ?? driver="oracle.jdbc.driver.OracleDriver"

          ????? ?????????? username="${config.database.user}"

          ????? ?????????? password="${config.database.password}"

          ????? ?????????? schema="${config.database.user}"

          ????? ?????????? includeViews="false">

          ????? ??????????

          ??????? ???????????????? package="entity"

          ??????? ???????????????? genXDocletTags="true"?? ??????? javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"/>

          ???

          ?

          上述build片斷中middlegen部分主要說明了在使用middlegen過程中的一些配置,關(guān)于數(shù)據(jù)庫部分不用多說,主要說明guiprefsdir部分。Middlegen自帶了一個GUI界面用來即時的變更數(shù)據(jù)庫字段和生成文件之間的映射關(guān)系,如果將gui屬性設(shè)置為true,那么在代碼生成之前會跳出一個界面讓你來配置數(shù)據(jù)庫字段和生成文件之間的對應(yīng)關(guān)系,但是對于每日構(gòu)建來說這不太合適,應(yīng)為這個過程序要人為的干涉,哪怕只是點擊確認按鈕。同時middlegen提供了一個prefsdir選項,middlegen會自動地在該選項指定的目錄下尋找文件appname-prefs.properties,根據(jù)該文件中定義的對應(yīng)關(guān)系來生成文件。其中appname就是上述定義的appname,本例中為mda-prefs.propertyes。

          hibernate部分主要說明生成hbm文件的一些屬性,例如destination說明了生成文件的位置。Package說明了生成hbm文件對應(yīng)的java文件的所在包。GenXDocletTags說明了是否在hbm文件內(nèi)部保留元數(shù)據(jù)標記。

          如下是一個mda-prefs.propertyes文件的一部分:

          hibernate.tables.GENINKBNINFO.base-class-name=GeninKbnInfoEntity

          hibernate.tables.GENINKBNINFO.columns.GENINKBN.java-name=geninKbn

          hibernate.tables.GENINKBNINFO.columns.GENINKBN.java-type=java.lang.String

          hibernate.tables.GENINKBNINFO.columns.GENINKBNCD.java-name=geninKbnCD

          hibernate.tables.GENINKBNINFO.columns.GENINKBNCD.java-type=java.lang.Integer

          以上說明對于數(shù)據(jù)庫中的表GENINKBNINFO對應(yīng)的Java類為GeninKbnInfoEntity,該表有兩個字段:GENINKBNGENINKBNCD,其中字段GENINKBN對應(yīng)的java字段的屬性名為geninKbn,類型為String。字段GENINKBNCD對應(yīng)得java字段屬性名為geninKbnCD,類型為Integer,生成的hbm文件為:

          ??? "-//Hibernate/Hibernate Mapping DTD 2.0//EN"

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

          ???

          ??? name="entity.GeninKbnInfoEntity"

          ??? table="GENINKBNINFO"

          >

          ???

          ?????? @hibernate.class

          ??????? table="GENINKBNINFO"

          ???

          ???

          ??????? name="geninKbnCD"

          ??????? type="java.lang.Integer"

          ??????? column="GENINKBNCD"

          ??? >

          ???????

          ?????????? @hibernate.id

          ??????????? generator-class="assigned"

          ??????????? type="java.lang.Integer"

          ??????????? column="GENINKBNCD"

          ???????

          ???????

          ???

          ???

          ??????? name="geninKbn"

          ??????? type="java.lang.String"

          ??????? column="GENINKBN"

          ??????? not-null="true"

          ??????? length="40"

          ??? >

          ???????

          ?????????? @hibernate.property

          ??????????? column="GENINKBN"

          ??????????? length="40"

          ??????????? not-null="true"

          ??????? ???

          ???

          ???

          ?

          然后使用如下build片斷來根據(jù)hbm文件自動生成java文件。

          ?? description="Generate .java from .hbm files." depends="mid-gen">

          ??

          ????? name="hbm2java"

          ????? classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"

          ????? classpathref="classpath.path"/>

          ??

          ?????

          ????????

          ?????

          ??

          ?

          hbm2javahibernate自帶的一個工具你必須從hibernate網(wǎng)站上下載一個叫做hibernate-tools.jar的工具,并且將它加載到classpath下面,如下是該工具生成的Java代碼:

          package entity;

          import java.io.Serializable;

          import org.apache.commons.lang.builder.EqualsBuilder;

          import org.apache.commons.lang.builder.HashCodeBuilder;

          import org.apache.commons.lang.builder.ToStringBuilder;

          /**

          ?*??????? @hibernate.class

          ?*???????? table="GENINKBNINFO"

          ?*????

          */

          public class GeninKbnInfoEntity implements Serializable {

          ??? /** identifier field */

          ??? private Integer geninKbnCD;

          ??? /** persistent field */

          ??? private String geninKbn;

          ??? /** full constructor */

          ??? public GeninKbnInfoEntity(Integer geninKbnCD, String geninKbn) {

          ??????? this.geninKbnCD = geninKbnCD;

          ??????? this.geninKbn = geninKbn;

          ??? }

          ??? /** default constructor */

          ??? public GeninKbnInfoEntity() {

          ??? }

          ??? /**

          ???? *??????????? @hibernate.id

          ???? *???????????? generator-class="assigned"

          ???? *???????????? type="java.lang.Integer"

          ???? *???????????? column="GENINKBNCD"

          ???? *????????

          ???? */

          ??? public Integer getGeninKbnCD() {

          ??????? return this.geninKbnCD;

          ??? }

          ??? public void setGeninKbnCD(Integer geninKbnCD) {

          ??????? this.geninKbnCD = geninKbnCD;

          ??? }

          ??? /**

          ???? *??????????? @hibernate.property

          ???? *???????????? column="GENINKBN"

          ???? *???????????? length="40"

          ?? ??*???????????? not-null="true"

          ???? *????????

          ???? */

          ??? public String getGeninKbn() {

          ??????? return this.geninKbn;

          ??? }

          ??? public void setGeninKbn(String geninKbn) {

          ??????? this.geninKbn = geninKbn;

          ??? }

          ??? public String toString() {

          ??????? return new ToStringBuilder(this)

          ??????????? .append("geninKbnCD", getGeninKbnCD())

          ??????????? .toString();

          ??? }

          ??? public boolean equals(Object other) {

          ??????? if ( !(other instanceof GeninKbnInfoEntity) ) return false;

          ??????? GeninKbnInfoEntity castOther = (GeninKbnInfoEntity) other;

          ??????? return new EqualsBuilder()

          ??????????? .append(this.getGeninKbnCD(), castOther.getGeninKbnCD())

          ??????????? .isEquals();

          ??? }

          ??? public int hashCode() {

          ??????? return new HashCodeBuilder()

          ??????????? .append(getGeninKbnCD())

          ??????????? .toHashCode();

          ??? }

          }

          生成的java文件中帶有Xdoclet標簽,完全可以在從Java文件生成Hbm文件,這里不講具體的過程,可以參看后續(xù)的Xdoclet部分。

          ?

          使用Hibernate的一個不便之處就是要維護數(shù)據(jù)庫schema,hbm文件和java文件的一致性,而Middlegen可以幫助你完成這些。

          Middlegen是一個基于Xdoclet的代碼,配置文件自動生成工具。它支持目前流行的大部分的技術(shù),例如EJB,JDO,HibernateTorqueJSP/Struts等。

          Middlegen主要根據(jù)你已有的數(shù)據(jù)庫Schema根據(jù)你的要求來自動的生成你所需要的文件,這大大的降低了開發(fā)難度,提高了開發(fā)速度。使用Middlegen的另一個顯而易見的好處是你所有的代碼可以在一分鐘之內(nèi)和數(shù)據(jù)庫同步。

          使用Middlegen自動的生成Hbm文件和Java文件包括兩步,第一,根據(jù)數(shù)據(jù)庫Schema生成Hbm文件。第二,根據(jù)hbm文件生成與之對應(yīng)得Java文件,這些文件主要是與數(shù)據(jù)庫表對應(yīng)得持久化類。Middlegen的主要功能都必須在ant環(huán)境下使用,下述build文件片斷說明了如何定義自定義的任務(wù)(task

          name="middlegen"

          classname="middlegen.MiddlegenTask"

          classpathref="classpath.path"/>

          ????? ?? name="hbm2java"

          ????? ?? classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"

          ????? ?? classpathref="classpath.path"/>

          其中第一個taskdef定義了用于根據(jù)數(shù)據(jù)庫schema生成hbm文件的自定義任務(wù)(middlegen)。第二個taskdef定義了用于使用hbm文件自動生成持久化Java文件的自定義任務(wù)(hbm2java)。其中要說明的是classpath.path指定的路徑下必須包含middlegen攜帶的jar文件和hibernate攜帶的jar文件。

          使用自定義任務(wù)來生成hbm文件:

          name="middlegen"

          classname="middlegen.MiddlegenTask"

          classpathref="classpath.path"/>

          ??? ????

          ????? ?????????? prefsdir="${conf.dir}"

          ???? ??????????? gui="false"

          ????? ?????????? databaseurl="${config.database.url}"

          ????? ?? driver="oracle.jdbc.driver.OracleDriver"

          ????? ?????????? username="${config.database.user}"

          ????? ?????????? password="${config.database.password}"

          ????? ?????????? schema="${config.database.user}"

          ????? ?????????? includeViews="false">

          ????? ??????????

          ??????? ???????????????? package="entity"

          ??????? ???????????????? genXDocletTags="true"?? ??????? javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"/>

          ???

          ?

          上述build片斷中middlegen部分主要說明了在使用middlegen過程中的一些配置,關(guān)于數(shù)據(jù)庫部分不用多說,主要說明guiprefsdir部分。Middlegen自帶了一個GUI界面用來即時的變更數(shù)據(jù)庫字段和生成文件之間的映射關(guān)系,如果將gui屬性設(shè)置為true,那么在代碼生成之前會跳出一個界面讓你來配置數(shù)據(jù)庫字段和生成文件之間的對應(yīng)關(guān)系,但是對于每日構(gòu)建來說這不太合適,應(yīng)為這個過程序要人為的干涉,哪怕只是點擊確認按鈕。同時middlegen提供了一個prefsdir選項,middlegen會自動地在該選項指定的目錄下尋找文件appname-prefs.properties,根據(jù)該文件中定義的對應(yīng)關(guān)系來生成文件。其中appname就是上述定義的appname,本例中為mda-prefs.propertyes。

          hibernate部分主要說明生成hbm文件的一些屬性,例如destination說明了生成文件的位置。Package說明了生成hbm文件對應(yīng)的java文件的所在包。GenXDocletTags說明了是否在hbm文件內(nèi)部保留元數(shù)據(jù)標記。

          如下是一個mda-prefs.propertyes文件的一部分:

          hibernate.tables.GENINKBNINFO.base-class-name=GeninKbnInfoEntity

          hibernate.tables.GENINKBNINFO.columns.GENINKBN.java-name=geninKbn

          hibernate.tables.GENINKBNINFO.columns.GENINKBN.java-type=java.lang.String

          hibernate.tables.GENINKBNINFO.columns.GENINKBNCD.java-name=geninKbnCD

          hibernate.tables.GENINKBNINFO.columns.GENINKBNCD.java-type=java.lang.Integer

          以上說明對于數(shù)據(jù)庫中的表GENINKBNINFO對應(yīng)的Java類為GeninKbnInfoEntity,該表有兩個字段:GENINKBNGENINKBNCD,其中字段GENINKBN對應(yīng)的java字段的屬性名為geninKbn,類型為String。字段GENINKBNCD對應(yīng)得java字段屬性名為geninKbnCD,類型為Integer,生成的hbm文件為:

          ??? "-//Hibernate/Hibernate Mapping DTD 2.0//EN"

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

          ???

          ??? name="entity.GeninKbnInfoEntity"

          ??? table="GENINKBNINFO"

          >

          ???

          ?????? @hibernate.class

          ??????? table="GENINKBNINFO"

          ???

          ???

          ??????? name="geninKbnCD"

          ??????? type="java.lang.Integer"

          ??????? column="GENINKBNCD"

          ??? >

          ???????

          ?????????? @hibernate.id

          ??????????? generator-class="assigned"

          ??????????? type="java.lang.Integer"

          ??????????? column="GENINKBNCD"

          ???????

          ???????

          ???

          ???

          ??????? name="geninKbn"

          ??????? type="java.lang.String"

          ??????? column="GENINKBN"

          ??????? not-null="true"

          ??????? length="40"

          ??? >

          ???????

          ?????????? @hibernate.property

          ??????????? column="GENINKBN"

          ??????????? length="40"

          ??????????? not-null="true"

          ??????? ???

          ???

          ???

          ?

          然后使用如下build片斷來根據(jù)hbm文件自動生成java文件。

          ?? description="Generate .java from .hbm files." depends="mid-gen">

          ??

          ????? name="hbm2java"

          ????? classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"

          ????? classpathref="classpath.path"/>

          ??

          ?????

          ????????

          ?????

          ??

          ?

          hbm2javahibernate自帶的一個工具你必須從hibernate網(wǎng)站上下載一個叫做hibernate-tools.jar的工具,并且將它加載到classpath下面,如下是該工具生成的Java代碼:

          package entity;

          import java.io.Serializable;

          import org.apache.commons.lang.builder.EqualsBuilder;

          import org.apache.commons.lang.builder.HashCodeBuilder;

          import org.apache.commons.lang.builder.ToStringBuilder;

          /**

          ?*??????? @hibernate.class

          ?*???????? table="GENINKBNINFO"

          ?*????

          */

          public class GeninKbnInfoEntity implements Serializable {

          ??? /** identifier field */

          ??? private Integer geninKbnCD;

          ??? /** persistent field */

          ??? private String geninKbn;

          ??? /** full constructor */

          ??? public GeninKbnInfoEntity(Integer geninKbnCD, String geninKbn) {

          ??????? this.geninKbnCD = geninKbnCD;

          ??????? this.geninKbn = geninKbn;

          ??? }

          ??? /** default constructor */

          ??? public GeninKbnInfoEntity() {

          ??? }

          ??? /**

          ???? *??????????? @hibernate.id

          ???? *???????????? generator-class="assigned"

          ???? *???????????? type="java.lang.Integer"

          ???? *???????????? column="GENINKBNCD"

          ???? *????????

          ???? */

          ??? public Integer getGeninKbnCD() {

          ??????? return this.geninKbnCD;

          ??? }

          ??? public void setGeninKbnCD(Integer geninKbnCD) {

          ??????? this.geninKbnCD = geninKbnCD;

          ??? }

          ??? /**

          ???? *??????????? @hibernate.property

          ???? *???????????? column="GENINKBN"

          ???? *???????????? length="40"

          ?? ??*???????????? not-null="true"

          ???? *????????

          ???? */

          ??? public String getGeninKbn() {

          ??????? return this.geninKbn;

          ??? }

          ??? public void setGeninKbn(String geninKbn) {

          ??????? this.geninKbn = geninKbn;

          ??? }

          ??? public String toString() {

          ??????? return new ToStringBuilder(this)

          ??????????? .append("geninKbnCD", getGeninKbnCD())

          ??????????? .toString();

          ??? }

          ??? public boolean equals(Object other) {

          ??????? if ( !(other instanceof GeninKbnInfoEntity) ) return false;

          ??????? GeninKbnInfoEntity castOther = (GeninKbnInfoEntity) other;

          ??????? return new EqualsBuilder()

          ??????????? .append(this.getGeninKbnCD(), castOther.getGeninKbnCD())

          ??????????? .isEquals();

          ??? }

          ??? public int hashCode() {

          ??????? return new HashCodeBuilder()

          ??????????? .append(getGeninKbnCD())

          ??????????? .toHashCode();

          ??? }

          }

          生成的java文件中帶有Xdoclet標簽,完全可以在從Java文件生成Hbm文件,這里不講具體的過程,可以參看后續(xù)的Xdoclet部分。

          ]]>
          posted on 2005-08-19 17:16 Sung 閱讀(498) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 云安县| 青海省| 新竹市| 仁化县| 贵阳市| 府谷县| 汉中市| 临漳县| 长岭县| 云阳县| 报价| 辉县市| 宽城| 桐庐县| 应用必备| 东乌珠穆沁旗| 阳高县| 泸定县| 屯昌县| 大足县| 水富县| 麻栗坡县| 城固县| 永川市| 黎川县| 邵东县| 新建县| 淄博市| 宁海县| 星座| 胶南市| 霍城县| 临夏市| 凭祥市| 长海县| 金门县| 论坛| 望奎县| 嘉鱼县| 安国市| 河北省|