使用Hibernate的一個不便之處就是要維護數據庫schema,hbm文件和java文件的一致性,而Middlegen可以幫助你完成這些。
Middlegen是一個基于Xdoclet的代碼,配置文件自動生成工具。它支持目前流行的大部分的技術,例如EJB,JDO,Hibernate,Torque,JSP/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過程中的一些配置,關于數據庫部分不用多說,主要說明gui和prefsdir部分。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,該表有兩個字段:GENINKBN和GENINKBNCD,其中字段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"/>
??
?????
????????
?????
??
?
hbm2java是hibernate自帶的一個工具你必須從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的一個不便之處就是要維護數據庫schema,hbm文件和java文件的一致性,而Middlegen可以幫助你完成這些。
Middlegen是一個基于Xdoclet的代碼,配置文件自動生成工具。它支持目前流行的大部分的技術,例如EJB,JDO,Hibernate,Torque,JSP/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過程中的一些配置,關于數據庫部分不用多說,主要說明gui和prefsdir部分。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,該表有兩個字段:GENINKBN和GENINKBNCD,其中字段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"/>
??
?????
????????
?????
??
?
hbm2java是hibernate自帶的一個工具你必須從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部分。
]]>