论坛首页 Java企业应用论坛

hibernate进阶篇之xdoclet自动生成mapping文件

浏览 19243 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-02-12  
本篇文章采用的例子请看《hibernate入门篇之新增功能!》的系列文章。
读本文之前,假设你对eclipse和ant有了一定的了解。

1.开发环境 jsdk1.4.2   eclipse2.1.2   hibernate2.1.1   xdoclet1.2   eclipse2.1.2->ant1.5.3

2.eclipse中ant的问题解决:在eclipse>Window>Preferences>Ant>Runtime>Classpath中加上jsdk的tools.jar。
问题在: 运行ant提示需要JAVA_HOME,在eclipse中如何设置。

3.构建build.xml文件片断:
    这是xdoclet的使用规范,其中name="hibernatedoclet",要跟下面定义的标签一样。

    <taskdef
        name="hibernatedoclet"
        classname="xdoclet.modules.hibernate.HibernateDocletTask"
        classpathref="xdoclet.class.path"
    />
    
<target name="xdoclet.hibernate.mapping" depends="compile">

    <echo>+---------------------------------------------------+</echo>
    <echo>|                                                   |</echo>
    <echo>| R U N N I N G   H I B E R N A T E D O C L E T     |</echo>
    <echo>|                                                   |</echo>
    <echo>+---------------------------------------------------+</echo>
    <!-- 这里要和taskdef->name中定义的值一样。同是:hibernatedoclet -->
    <hibernatedoclet destdir="${build.classes}" verbose="true">
        <fileset dir="${src.dir}">
            <include name="**/*.java" />
        </fileset>
     <!-- 默认为1.1,我们使用的2.X以上版本,用2.0这个版本 -->
        <hibernate version="2.0"/>
        
    </hibernatedoclet>
    
</target>

其余有什么不懂得地方请参考资料说的内容。

4.我只那一个例子说明一下:
package com.javamodel.hibernate;

import java.util.HashSet;
import java.util.Set;

/**
 * @hibernate.class
 *      table="author"
 *      dynamic-update="true"
 *      dynamic-insert="true"
 *      这个类对应的表是author
 */

public class Author{
	
	private String id ;
	private String alias = null;
	private Person person = null;
	private Set publications = new HashSet();;
	private Set works = new HashSet();;
	
	/**
	 * @hibernate.id 
	 *  unsaved-value="null" generator-class="foreign"
	 *  定义外键
	 * @hibernate.generator-param 
	 *  name="property" value="person"
	 *  对应的Author对应的属性
	 */
	public String getId(); {
		return id;
	}

	public void setId(String i); {
		id = i;
	}
	
	/**
	 * @hibernate.property 
	 *  length="20"
	 *  声明表中对应的字段  
	 */
	public String getAlias(); {
		return alias;
	}

	public void setAlias(String string); {
		alias = string;
	}
	
	/**
	 * @hibernate.one-to-one
	 *  cascade="all" constrained="true"
	 * 在Author与Person之间,声明one-to-one的关联关系
	 */
	public Person getPerson(); {
		return person;
	}

	public void setPerson(Person person); {
		this.person = person;
	}

	/**
         * @hibernate.set
	 *  lazy="true" inverse="true" cascade="all"
	 * 定义Hibernate <set> collection
	 * @hibernate.collection-key
	 *  column="authorid"
	 * 对应表中的字段
	 * @hibernate.collection-one-to-many
	 *  class="com.javamodel.hibernate.Publication"
	 * 在Author与Publication之间,声明one-to-many的关联关系
	 */
	public Set getPublications(); {
		return publications;
	}

	public void setPublications(Set set); {
		publications = set;
	}

	/**
	 * @hibernate.set
	 *  lazy="true"
	 *  table="author_work"
	 * @hibernate.collection-key
	 *  column="author_id"
	 * @hibernate.collection-many-to-many
	 *  column="work_id"
	 *  class="com.javamodel.hibernate.Work"
	 */
	public Set getWorks(); {
		return works;
	}

	public void setWorks(Set set); {
		works = set;
	}

}

5.在src中的hbm.xml文件为手写文件。build/classes的hbm.xml文件为自动生成文件。
自动生成的mapping文件没有经过测试。本文的重点在如何生成mapping文件。请谅解。

参考资料:
http://dev.eclipse.org/newslists/news.eclipse.tools.jdt/msg05557.html
解决了在eclipse中使用ant发现需要JAVA_HOME的问题的出处。
O'Reilly的《Ant权威指南》。
IBM JAVA技术专区中的教程《Apache Ant 101:使 Java 项目生成易如反掌》
hibernate相关文档:http://www.hibernate.org
ant相关文档:http://ant.apache.org
xdoclet相关文档:http://sourceforge.net/projects/xdoclet
   发表时间:2004-02-16  
http://forum.iteye.com/viewtopic.php?t=3029

通用英文没有翻译,不懂的没有翻译,翻译了的还可能不对:-(
0 请登录后投票
   发表时间:2004-02-21  
有个问题,一直不知道怎样处理
xdoclet的标记不能够重复用在一个方法前面吗????
hibernate.many-to-one 只被识别第一个

import java.util.Collection;
/**
 * @author Administrator
 * @hibernate.class table="BugLevel"
 * To change the template for this generated type comment go to
 * Window&amp;Preferences&amp;Java&amp;Code Generation&amp;Code and Comments
 */
public class BugLevel extends SprFunc{

    private Collection roleModules;

    /**
     * @hibernate.set name="roleModules" table="role_module" cascade="all" inverse="true" lazy="true"
     * @hibernate.collection-key column="bugLevelId"
     * @hibernate.collection-composite-element class="net.gemfree.tmanager.persistent.RoleModule"
     * @hibernate.many-to-one name="bugPreference" column="bugPreferenceId" class="net.gemfree.tmanager.persistent.BugPreference"
     * @hibernate.many-to-one name="bugStatus" column="bugStatusId" class="net.gemfree.tmanager.persistent.BugStatus"
     * @hibernate.many-to-one name="module" column="modId" class="net.gemfree.tmanager.persistent.Module"
     * @hibernate.many-to-one name="role" column="roleId" class="net.gemfree.tmanager.persistent.Role"
     *
     * @return Collection
     */
    public Collection getRoleModules(); {
        return roleModules;
    }

    public void setRoleModules(Collection roleModules); {
        this.roleModules = roleModules;
    }

}


<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class
        name="net.gemfree.tmanager.persistent.BugLevel"
        table="BugLevel"
        dynamic-update="false"
        dynamic-insert="false"
    >
        <id
            name="id"
            column="id"
            type="string"
            length="32"
          >
            <generator class="uuid.hex">
            </generator>
        </id>

        <set
            name="roleModules"
            table="role_module"
            lazy="true"
            inverse="true"
            cascade="all"
            sort="unsorted"
        >

              <key
                column="bugLevelId"
              />

              <composite-element
                  class="net.gemfree.tmanager.persistent.RoleModule"
              >

                      <many-to-one
                          name="bugPreference"
                          class="net.gemfree.tmanager.persistent.BugPreference"
                          cascade="none"
                          outer-join="auto"
                          update="true"
                          insert="true"
                       />
              </composite-element>

        </set>

        <set
            name="sprs"
            lazy="true"
            inverse="true"
            cascade="save-update"
            sort="unsorted"
        >

              <key
                column="id"
              />

              <one-to-many
                  class="net.gemfree.tmanager.persistent.Spr"
              />
        </set>

        <property
            name="name"
            type="java.lang.String"
            update="true"
            insert="true"
         >
            <column
                name="name"
                length="50"
                not-null="false"
                unique="false"
             />
          </property>

        <!--
            To add non XDoclet property mappings, create a file named
                hibernate-properties-BugLevel.xml
            containing the additional properties and place it in your merge dir.
        -->

    </class>

</hibernate-mapping>
0 请登录后投票
   发表时间:2004-02-21  
已搞定
0 请登录后投票
   发表时间:2004-03-25  
请问是怎么解决的,我也碰到类似的问题
0 请登录后投票
   发表时间:2004-04-28  
太棒了,总算学会用edoclet了,太方便了,感谢楼主
0 请登录后投票
   发表时间:2004-04-29  
请问楼主,如何在Maven中使用xdoclet?xdocelt的文档中只有一个ejbdoclet的指南,修改为hibernatedocelt、安装maven plugin之后,总是报错,部分pojo能够正确生成,部分不行,而使用ant是没有问题的。
0 请登录后投票
   发表时间:2004-04-29  
maven 我没用过。不知为何物。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics