- 论坛徽章:
- 0
|
一、新建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 |
|