xdoclet升級到1.2.3了,文檔上說是支持hibernate 3了,實際上,經過今天的檢驗,發現xdoclet 1.2.3只是支持hibernate 3的map文件了,而生成的hibernate 3的config文件,卻還hibernate 2的。
?
package events;
import java.util.Date;
/**
?*
?* @hibernate.class table="EVENTS"
?*/
public class Event {
??? private Long id;
??? private String title;
??? 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;
??? }
??? private void setId(Long id) {
??????? this.id = id;
??? }
??? /**
???? * @hibernate.property
???? * column="EVENT_DATE"
???? * type = "timestamp"
???? *
???? *
???? */
??? public Date getDate() {
??????? return date;
??? }
??? public void setDate(Date date) {
??????? this.date = date;
??? }
??? /**
???? * @hibernate.property
???? * column="EVENT_TITLE"
???? * length="20"
???? *
???? */
??? public String getTitle() {
??????? return title;
??? }
??? public void setTitle(String 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"/>
??? <path id="libraries">
??????? <fileset dir="${librarydir}">
??????????? <include name="*.jar"/>
??????? </fileset>
??? </path>
??? <target name="clean">
??????? <delete dir="${targetdir}"/>
??????? <mkdir dir="${targetdir}"/>
??? </target>
??? <target name="compile" depends="clean, copy-resources">
??????? <javac srcdir="${sourcedir}"
?????????????? destdir="${targetdir}"
?????????????? classpathref="libraries"/>
??? </target>
??? <target name="copy-resources">
??????? <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>
??? <target name="hibernate" depends="compile" description="Generate mapping documents">
????????? <hibernatedoclet
??????????????? destdir="${targetdir}"
??????????????? excludedtags="@version,@author,@todo,@see"
??????????????? force="false"
??????????????? verbose="true">
??????????????? <fileset dir="${sourcedir}">
??????????????????? <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"/>
??????????? </hibernatedoclet>
??????? </target>
</project>
?
結果如下:
Event.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping
>
??? <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>
??????? <property
??????????? 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"
??????? />
??????? <!--
??????????? 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:
<!-- Generated file - Do not edit! -->
<hibernate-configuration>
?<!-- a SessionFactory instance listed as /jndi/name -->
?<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>
??<!-- mapping files -->
??<mapping resource="events/Event.hbm.xml"/>
?</session-factory>
</hibernate-configuration>
發現沒有,上面的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"/>
?
??? <path id="libraries">
??????? <fileset dir="${librarydir}">
??????????? <include name="*.jar"/>
??????? </fileset>
??? </path>
??? <target name="clean">
??????? <delete dir="${targetdir}"/>
??????? <mkdir dir="${targetdir}"/>
??? </target>
??? <target name="compile" depends="clean, copy-resources">
??????? <javac srcdir="${sourcedir}"
?????????????? destdir="${targetdir}"
?????????????? classpathref="libraries"/>
??? </target>
??? <target name="copy-resources">
??????? <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>
??????? </target>
</project>
?
結果如下:
Event.hbm.xml:
<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>
發現用xdoclet1.2.3和xdoclet2產生的map文件還是有些區別的,包括形式和內容,也許那些區別都無所謂,但是畢竟有不同。從形式來看,明星xdoclet2產生的文件好看些,所以,以后,我看還是應該用xdoclet2來產生map文件。config文件,就手寫吧。
?
?
應用?xdoclet1.2.3和xdoclet2,要注意的最大的一點是:POJO的javadoc tag中的所有@hibernate.collection-xxxxx都已經改變成@hibernate.xxxx了。所以,對已有的POJO應用xdoclet2時,可能要做個簡單的替換工作。