Chinaunix首页 | 论坛 | 博客
  • 博客访问: 403518
  • 博文数量: 79
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 897
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-10 23:22
文章分类

全部博文(79)

文章存档

2011年(1)

2010年(6)

2009年(39)

2008年(33)

我的朋友

分类: Java

2009-11-17 22:19:46

一、新建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 Set<Organization> childrenOrg;//子机构

    geter and setter(..)
    }


三、数据表映射结果

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "">

<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的正确保存。

阅读(1230) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-07-16 18:44:03

KK娱乐视频网,快乐齐分享 www.yulekk.com 搞笑视频,动漫视频,美女写真,靓丽车模,美女翻唱,精彩MV,经典DV