Sung in Blog

                     一些技術文章 & 一些生活雜碎
          ?

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

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

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

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

          name="middlegen"

          classname="middlegen.MiddlegenTask"

          classpathref="classpath.path"/>

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

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

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

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

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

          hibernate部分主要說明生成hbm文件的一些屬性,例如destination說明了生成文件的位置。Package說明了生成hbm文件對應的java文件的所在包。GenXDocletTags說明了是否在hbm文件內部保留元數據標記。

          如下是一個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

          以上說明對于數據庫中的表GENINKBNINFO對應的Java類為GeninKbnInfoEntity,該表有兩個字段:GENINKBNGENINKBNCD,其中字段GENINKBN對應的java字段的屬性名為geninKbn,類型為String。字段GENINKBNCD對應得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片斷來根據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網站上下載一個叫做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文件,這里不講具體的過程,可以參看后續的Xdoclet部分。

          ?

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

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

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

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

          name="middlegen"

          classname="middlegen.MiddlegenTask"

          classpathref="classpath.path"/>

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

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

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

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

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

          hibernate部分主要說明生成hbm文件的一些屬性,例如destination說明了生成文件的位置。Package說明了生成hbm文件對應的java文件的所在包。GenXDocletTags說明了是否在hbm文件內部保留元數據標記。

          如下是一個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

          以上說明對于數據庫中的表GENINKBNINFO對應的Java類為GeninKbnInfoEntity,該表有兩個字段:GENINKBNGENINKBNCD,其中字段GENINKBN對應的java字段的屬性名為geninKbn,類型為String。字段GENINKBNCD對應得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片斷來根據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網站上下載一個叫做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文件,這里不講具體的過程,可以參看后續的Xdoclet部分。

          ]]>
          posted on 2005-08-19 17:16 Sung 閱讀(496) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 古田县| 长治市| 汉阴县| 都昌县| 阿拉善盟| 洮南市| 黎平县| 错那县| 青川县| 钟山县| 汕头市| 黎川县| 中山市| 伊川县| 尚志市| 保德县| 汶川县| 鹤岗市| 志丹县| 望江县| 南乐县| 银川市| 大丰市| 永靖县| 沈阳市| 湖南省| 乐昌市| 渝北区| 曲靖市| 阿拉尔市| 六安市| 咸宁市| 衡山县| 南丰县| 胶州市| 桂阳县| 临安市| 马公市| 榕江县| 博兴县| 四平市|