免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2635 | 回复: 0
打印 上一主题 下一主题

【笔记】Ant+xdoclet完成数据库映射和hibernate.cfg.xml文件的生成 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-17 22:19 |只看该作者 |倒序浏览
一、新建build.xml

?xml version="1.0" encoding="GBK"?>
project name="OA系统构建脚本" default="生成Hibernate配置文件" basedir=".">
    property name="src.dir" value="${basedir}/src"/>
    property name="xdoclet.home" value="D:/xdoclet-plugins-dist-1.0.4"/>
   
    !-- build classpath -->
    path id="xdoclet.task.classpath">
        fileset dir="${xdoclet.home}/lib">
            include name="**/*.jar"/>
        /fileset>
    /path>   
    taskdef
        name="xdoclet"
        classname="org.xdoclet.ant.XDocletTask"
        classpathref="xdoclet.task.classpath"
    />
   
    target name="生成Hibernate配置文件">
        xdoclet>
            fileset dir="${src.dir}/com/oa/model">
                include name="**/*.java"/>
            /fileset>
            component
                classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin"
                destdir="${src.dir}"
                version="3.0"
                hbm2ddlauto="update"
                jdbcurl="jdbc:mysql://localhost/oa"
                jdbcdriver="com.mysql.jdbc.Driver"
                jdbcusername="root"
                jdbcpassword="123456"
                dialect="org.hibernate.dialect.MySQLDialect"
                showsql="true"
            />
            
        /xdoclet>
    /target>
   
    target name="生成hibernate映射文件">
        xdoclet>
            fileset dir="${src.dir}/com/oa/model">
                include name="**/*.java"/>
            /fileset>
            component
                classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
                version="3.0"
                destdir="${src.dir}"
            />
        /xdoclet>
    /target>
   
/project>
二、在POJO类中加入ant可以识别的标志,如:
/**
* @author caiqq
* @hibernate.class table="t_person"
*/
public class Person {
    /**
     * @hibernate.id
     * generator-class="native"
     */
    private int id;
    /**
     * @hibernate.property
     */
    private String name;
    /**
     * @hibernate.property
     */
    private String sn;//部门编号
    /**
     * @hibernate.property
     */
    private String description;//部门描述
    /**
     * @hibernate.many-to-one
     * column="pid"
     */
    private Organization parentOrg;//父机构
    /**
     * @hibernate.set inverse="true"
     * @hibernate.key column="pid"
     * @hibernate.one-to-many
     * class="com.oa.model.Organization"
     */
    private SetOrganization> childrenOrg;//子机构
    geter and setter(..)
    }
三、数据表映射结果
?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">
hibernate-mapping>
  class table="t_organization" name="com.oa.model.Organization">
    id access="field" name="id">
      generator class="native"/>
    /id>
    property name="name" access="field"/>
    property name="sn" access="field"/>
    property name="description" access="field"/>
    many-to-one column="pid" access="field" name="parentOrg"/>
    set access="field" name="childrenOrg" inverse="true">
      key column="pid"/>
      one-to-many class="com.oa.model.Organization"/>
    /set>
  /class>
/hibernate-mapping>
说明:
1、access属性的含义
access="field |property |ClassName"  
这里field表示Hibernate直接读取类中的字段值。
这种方式如果你在业务中不需要getter和setter的话,就可以不用写了。 这时,可以设置属性为不可变,可以不用执行脏检查。
property表示Hibernate通过getter和setter读取。
这种方式可以在getter和setter中做额外的处理
2、inverse属性的含义
  set access="field" name="childrenOrg" inverse="true">
      key column="pid"/>
      one-to-many class="com.oa.model.Organization"/>
  /set>
说明:inverse="true"指定了从多的一端childrenOrg来加载一的一端pid;
实际效果如下:
1)当 inverse="false"时,如下设置即可
//对父结构设置既能将所有子结构绑定上
Organization org1=new Organization();//父机构
org1.setName("父机构org1");
org1.setChildrenOrg(set);//set中包含子机构集合
2)当inverse="true"时,以上setChildrenOrg没有作用,需要如下设置
//每个子结构都必须手动设置父机构,否则无法绑定父结构
org2.setParentOrg(org1);
org3.setParentOrg(org1);
org4.setParentOrg(org1);
org5.setParentOrg(org1);
    Hibernate中,术语inverse是反转的意思,在关联关系中,inverse="false"为主控方,由主控方负责维护对象的关联关系。
    所以上面的映射文件改动之后,childrenOrg为主控方,pid为被控方,但是测试代码只进行了一个保存操作session.save(pid),这是针对pid的,因此无法正确级联保存childrenOrg。而原来的映射文件中(虽然没有明确指明,Hibernate默认inverse="false"),pid为主控方,因此保存pid时它会保证关联的childrenOrg的正确保存。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/35830/showart_2097092.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP