用xdoclet 和xdoclet2來產生hiberante map文件的一些區(qū)別
xdoclet升級到1.2.3了,文檔上說是支持hibernate 3了,實際上,經過今天的檢驗,發(fā)現xdoclet 1.2.3只是支持hibernate 3的map文件了,而生成的hibernate 3的config文件,卻還hibernate 2的。
?
一個簡單的例子(就是這個例子:ttp://www.redsaga.com/hibernate-ref/3.1.2/zh-cn/html/tutorial.html#tutorial-firstapp-firstclass,按它上面的介紹,設置好各個目錄結構):
package events;
import java.util.Date;
/**
?*
?* @hibernate.class table="EVENTS"
?*/
public class Event {
?*
?* @hibernate.class table="EVENTS"
?*/
public class Event {
??? private Long id;
??? private String title;
??? private Date date;
??? private Date date;
??? public Event() {
??? }
??? }
??? /**
???? * @hibernate.id
???? * generator-class="uuid.hex"
???? * type="java.lang.String"
???? * unsaved-value=""
???? * column="EVENT_ID"
???? */
??? public Long getId() {
??????? return id;
??? }
???? * @hibernate.id
???? * generator-class="uuid.hex"
???? * type="java.lang.String"
???? * unsaved-value=""
???? * column="EVENT_ID"
???? */
??? public Long getId() {
??????? return id;
??? }
??? private void setId(Long id) {
??????? this.id = id;
??? }
??????? this.id = id;
??? }
??? /**
???? * @hibernate.property
???? * column="EVENT_DATE"
???? * type = "timestamp"
???? *
???? *
???? */
??? public Date getDate() {
??????? return date;
??? }
???? * @hibernate.property
???? * column="EVENT_DATE"
???? * type = "timestamp"
???? *
???? *
???? */
??? public Date getDate() {
??????? return date;
??? }
??? public void setDate(Date date) {
??????? this.date = date;
??? }
??????? this.date = date;
??? }
??? /**
???? * @hibernate.property
???? * column="EVENT_TITLE"
???? * length="20"
???? *
???? */
??? public String getTitle() {
??????? return title;
??? }
???? * @hibernate.property
???? * column="EVENT_TITLE"
???? * length="20"
???? *
???? */
??? public String getTitle() {
??????? return title;
??? }
??? public void setTitle(String title) {
??????? this.title = title;
??? }
??????? this.title = title;
??? }
}
?
上面的POJO,已經加上了xdoclet的javadoc tag了,現在用下面的ant文件來產生map和config文件:
?
<project name="xdoclet" default="hibernatedoclet">
??? <property name="sourcedir" value="${basedir}/src"/>
??? <property name="targetdir" value="${basedir}/bin"/>
??? <property name="librarydir" value="${basedir}/lib"/>
??? <property name="sourcedir" value="${basedir}/src"/>
??? <property name="targetdir" value="${basedir}/bin"/>
??? <property name="librarydir" value="${basedir}/lib"/>
??? <path id="libraries">
??????? <fileset dir="${librarydir}">
??????????? <include name="*.jar"/>
??????? </fileset>
??? </path>
??????? <fileset dir="${librarydir}">
??????????? <include name="*.jar"/>
??????? </fileset>
??? </path>
??? <target name="clean">
??????? <delete dir="${targetdir}"/>
??????? <mkdir dir="${targetdir}"/>
??? </target>
??????? <delete dir="${targetdir}"/>
??????? <mkdir dir="${targetdir}"/>
??? </target>
??? <target name="compile" depends="clean, copy-resources">
??????? <javac srcdir="${sourcedir}"
?????????????? destdir="${targetdir}"
?????????????? classpathref="libraries"/>
??? </target>
??????? <javac srcdir="${sourcedir}"
?????????????? destdir="${targetdir}"
?????????????? classpathref="libraries"/>
??? </target>
??? <target name="copy-resources">
??????? <copy todir="${targetdir}">
??????????? <fileset dir="${sourcedir}">
??????????????? <exclude name="**/*.java"/>
??????????? </fileset>
??????? </copy>
??? </target>
??????? <copy todir="${targetdir}">
??????????? <fileset dir="${sourcedir}">
??????????????? <exclude name="**/*.java"/>
??????????? </fileset>
??????? </copy>
??? </target>
??? <taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask">
?????? <classpath>
???????????? <fileset dir="E:/workspace/xdoclet-1.2.3/lib" includes="*.jar"/>
??????? </classpath>
??? </taskdef>
?????? <classpath>
???????????? <fileset dir="E:/workspace/xdoclet-1.2.3/lib" includes="*.jar"/>
??????? </classpath>
??? </taskdef>
??? <target name="hibernate" depends="compile" description="Generate mapping documents">
????????? <hibernatedoclet
??????????????? destdir="${targetdir}"
??????????????? excludedtags="@version,@author,@todo,@see"
??????????????? force="false"
??????????????? verbose="true">
????????? <hibernatedoclet
??????????????? destdir="${targetdir}"
??????????????? excludedtags="@version,@author,@todo,@see"
??????????????? force="false"
??????????????? verbose="true">
??????????????? <fileset dir="${sourcedir}">
??????????????????? <include name="**/*.java"/>
??????????????? </fileset>
??????????????????? <include name="**/*.java"/>
??????????????? </fileset>
??????????????? <hibernatecfg
??????????????????????? dialect="net.sf.hibernate.dialect.xxxxx"
??????????????????????? driver="com.mysql.jdbc.Driver"
??????????????????????? jdbcUrl="jdbc:mysql://xxxxx"
??????????????????????? userName="xxxxx"
??????????????????????? password="xxxxx"/>
???????????????????????
???????????????? <hibernate version="3.0"/>
??????????????????????? dialect="net.sf.hibernate.dialect.xxxxx"
??????????????????????? driver="com.mysql.jdbc.Driver"
??????????????????????? jdbcUrl="jdbc:mysql://xxxxx"
??????????????????????? userName="xxxxx"
??????????????????????? password="xxxxx"/>
???????????????????????
???????????????? <hibernate version="3.0"/>
??????????? </hibernatedoclet>
??????? </target>
??????? </target>
</project>
?
結果如下:
Event.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
??? "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
??? "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
??? "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
??? "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
>
??? <class
??????? name="events.Event"
??????? table="EVENTS"
??? >
>
??? <class
??????? name="events.Event"
??????? table="EVENTS"
??? >
??????? <id
??????????? name="id"
??????????? column="EVENT_ID"
??????????? type="java.lang.String"
??????????? unsaved-value=""
??????? >
??????????? <generator class="uuid.hex">
????????????? <!--?
????????????????? To add non XDoclet generator parameters, create a file named
????????????????? hibernate-generator-params-Event.xml
????????????????? containing the additional parameters and place it in your merge dir.
????????????? -->
??????????? </generator>
??????? </id>
??????????? name="id"
??????????? column="EVENT_ID"
??????????? type="java.lang.String"
??????????? unsaved-value=""
??????? >
??????????? <generator class="uuid.hex">
????????????? <!--?
????????????????? To add non XDoclet generator parameters, create a file named
????????????????? hibernate-generator-params-Event.xml
????????????????? containing the additional parameters and place it in your merge dir.
????????????? -->
??????????? </generator>
??????? </id>
??????? <property
??????????? name="date"
??????????? type="timestamp"
??????????? update="true"
??????????? insert="true"
??????????? column="EVENT_DATE"
??????? />
??????????? name="date"
??????????? type="timestamp"
??????????? update="true"
??????????? insert="true"
??????????? column="EVENT_DATE"
??????? />
??????? <property
??????????? name="title"
??????????? type="java.lang.String"
??????????? update="true"
??????????? insert="true"
??????????? column="EVENT_TITLE"
??????????? length="20"
??????? />
??????????? name="title"
??????????? type="java.lang.String"
??????????? update="true"
??????????? insert="true"
??????????? column="EVENT_TITLE"
??????????? length="20"
??????? />
??????? <!--
??????????? To add non XDoclet property mappings, create a file named
??????????????? hibernate-properties-Event.xml
??????????? containing the additional properties and place it in your merge dir.
??????? -->
??????????? To add non XDoclet property mappings, create a file named
??????????????? hibernate-properties-Event.xml
??????????? containing the additional properties and place it in your merge dir.
??????? -->
??? </class>
</hibernate-mapping>
hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<!-- Generated file - Do not edit! -->
<hibernate-configuration>
?<!-- a SessionFactory instance listed as /jndi/name -->
?<session-factory>
?<session-factory>
??<!-- properties -->
??<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
??<property name="show_sql">false</property>
??<property name="use_outer_join">false</property>
???<property name="connection.username">hibernate</property>
???<property name="connection.password">aPassword</property>
???<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
???<property name="connection.url">jdbc:mysql://xxx</property>
??<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
??<property name="show_sql">false</property>
??<property name="use_outer_join">false</property>
???<property name="connection.username">hibernate</property>
???<property name="connection.password">aPassword</property>
???<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
???<property name="connection.url">jdbc:mysql://xxx</property>
??<!-- mapping files -->
??<mapping resource="events/Event.hbm.xml"/>
?</session-factory>
??<mapping resource="events/Event.hbm.xml"/>
?</session-factory>
</hibernate-configuration>
發(fā)現沒有,上面的config文件中的DTD版本還是2.0。
?
對于hibernate3來說,現在多了個選擇,用xdoclet2也可以產生map文件,但是config文件好像沒有辦法。
還是用上面POJO,對應的ant文件如下(注意,簡單起見,要把xdoclet2下面的lib目錄下的jar文件,全部copy到${basedir}/lib下):
<project name="xdoclet2-plugin" default="hibernatedoclet">
??? <property name="sourcedir" value="${basedir}/src"/>
??? <property name="targetdir" value="${basedir}/bin"/>
???? <property name="librarydir" value="${basedir}/lib"/>
??? <property name="targetdir" value="${basedir}/bin"/>
???? <property name="librarydir" value="${basedir}/lib"/>
?
??? <path id="libraries">
??????? <fileset dir="${librarydir}">
??????????? <include name="*.jar"/>
??????? </fileset>
??? </path>
??????? <fileset dir="${librarydir}">
??????????? <include name="*.jar"/>
??????? </fileset>
??? </path>
??? <target name="clean">
??????? <delete dir="${targetdir}"/>
??????? <mkdir dir="${targetdir}"/>
??? </target>
??????? <delete dir="${targetdir}"/>
??????? <mkdir dir="${targetdir}"/>
??? </target>
??? <target name="compile" depends="clean, copy-resources">
??????? <javac srcdir="${sourcedir}"
?????????????? destdir="${targetdir}"
?????????????? classpathref="libraries"/>
??? </target>
??????? <javac srcdir="${sourcedir}"
?????????????? destdir="${targetdir}"
?????????????? classpathref="libraries"/>
??? </target>
??? <target name="copy-resources">
??????? <copy todir="${targetdir}">
??????????? <fileset dir="${sourcedir}">
??????????????? <exclude name="**/*.java"/>
??????????? </fileset>
??????? </copy>
??? </target>
??????? <copy todir="${targetdir}">
??????????? <fileset dir="${sourcedir}">
??????????????? <exclude name="**/*.java"/>
??????????? </fileset>
??????? </copy>
??? </target>
??? <target name="hibernatedoclet"
??????????? depends="compile"
??????????? description="Generate Persistence and form classes">
??????????? <taskdef
??????????????? name="xdoclet"
??????????????? classname="org.xdoclet.ant.XDocletTask"
??????????????? classpathref="libraries"
??????????????? />
??????????? <xdoclet>
??????????????? <!-- defines the file handled by xdoclet2 -->
??????????????? <fileset dir="${sourcedir}">
??????????????????? <include name="**/*.java"/>
??????????????? </fileset>
??????????????? <!-- defines the processing of a plugin -->
??????????????? <component
??????????????????? classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
??????????????????? destdir="${targetdir}"
??????????????????? version="3.0"
??????????????????? />
??????????? </xdoclet>
??????????? depends="compile"
??????????? description="Generate Persistence and form classes">
??????????? <taskdef
??????????????? name="xdoclet"
??????????????? classname="org.xdoclet.ant.XDocletTask"
??????????????? classpathref="libraries"
??????????????? />
??????????? <xdoclet>
??????????????? <!-- defines the file handled by xdoclet2 -->
??????????????? <fileset dir="${sourcedir}">
??????????????????? <include name="**/*.java"/>
??????????????? </fileset>
??????????????? <!-- defines the processing of a plugin -->
??????????????? <component
??????????????????? classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
??????????????????? destdir="${targetdir}"
??????????????????? version="3.0"
??????????????????? />
??????????? </xdoclet>
??????? </target>
</project>
?
結果如下:
Event.hbm.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
? <class table="EVENTS" name="events.Event">
??? <id type="java.lang.String" column="EVENT_ID" unsaved-value="" access="method" name="id">
????? <generator class="uuid.hex"/>
??? </id>
??? <property name="date" type="timestamp" access="method" column="EVENT_DATE"/>
??? <property name="title" length="20" access="method" column="EVENT_TITLE"/>
? </class>
</hibernate-mapping>
? <class table="EVENTS" name="events.Event">
??? <id type="java.lang.String" column="EVENT_ID" unsaved-value="" access="method" name="id">
????? <generator class="uuid.hex"/>
??? </id>
??? <property name="date" type="timestamp" access="method" column="EVENT_DATE"/>
??? <property name="title" length="20" access="method" column="EVENT_TITLE"/>
? </class>
</hibernate-mapping>
發(fā)現用xdoclet1.2.3和xdoclet2產生的map文件還是有些區(qū)別的,包括形式和內容,也許那些區(qū)別都無所謂,但是畢竟有不同。從形式來看,明星xdoclet2產生的文件好看些,所以,以后,我看還是應該用xdoclet2來產生map文件。config文件,就手寫吧。
?
?
應用?xdoclet1.2.3和xdoclet2,要注意的最大的一點是:POJO的javadoc tag中的所有@hibernate.collection-xxxxx都已經改變成@hibernate.xxxx了。所以,對已有的POJO應用xdoclet2時,可能要做個簡單的替換工作。