一、新建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的正确保存。
阅读(1298) | 评论(1) | 转发(0) |