我们可以在 java 代码中使用类似于 javadoc 的注释,来表达更多的内容。这些额外的注释,通过使用 xdoclet 工具,我们可以将它们转换为我们需要的各种配置文件。先看一个简单的例子:
比如有一个 java 文件的源代码如下:
productType跟自己是一对多的关系:这种情况比较特殊,set和many-to-one对应的均为外键
package com.babasport.VO; import java.util.Set; /** * @hibernate.class * table="productType" * @author sunqitang * */ public class ProductType { /** 商品类别Id **/ private Integer productTypeId; /** 商品类别名称 **/ private String productTypeName; /** 商品类别google搜索内容 **/ private String productTypeGoogle; /** 商品类别备注 **/ private String productTypeNote; /** 商品类别的子类别 **/ private Set<ProductType> subProductTypes; /** 商品类别的父类 **/ private ProductType parentProductType; /** * @hibernate.many-to-one * column="parentProductType" * class="com.babasport.VO.ProductType" * @return */ //这里也为目标对象的Id public ProductType getParentProductType() { return parentProductType; } public void setParentProductType(ProductType parentProductType) { this.parentProductType = parentProductType; } /** * @hibernate.set * cascade="all" * inverse="true" * lazy="true" * @hibernate.key column="parentProductType" * @hibernate.one-to-many class="com.babasport.VO.ProductType" * @return */ //这里的key的column为目标对象的Id public Set<ProductType> getSubProductTypes() { return subProductTypes; } public void setSubProductTypes(Set<ProductType> subProductTypes) { this.subProductTypes = subProductTypes; } /** * @hibernate.id * generator-class="native" * @return */ public Integer getProductTypeId() { return productTypeId; } public void setProductTypeId(Integer productTypeId) { this.productTypeId = productTypeId; } /** * @hibernate.property * not-null="true" * length="16" * @return */ public String getProductTypeName() { return productTypeName; } public void setProductTypeName(String productTypeName) { this.productTypeName = productTypeName; } /** * @hibernate.property * length="100" * @return */ public String getProductTypeGoogle() { return productTypeGoogle; } public void setProductTypeGoogle(String productTypeGoogle) { this.productTypeGoogle = productTypeGoogle; } /** * @hibernate.property * length="100" * @return */ public String getProductTypeNote() { return productTypeNote; } public void setProductTypeNote(String productTypeNote) { this.productTypeNote = productTypeNote; } }
通过 xdoclet ,我们可以得到关于这个类的 Hibernate 映射文件,如下:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="VO.Producttype" table="producttype" catalog="test"> <id name="id" type="java.lang.String"> <column name="id" length="10" /> <generator class="native" /> </id> <many-to-one name="producttype" class="VO.Producttype" fetch="select"> <column name="sub" length="10" /> </many-to-one> <set name="producttypes" inverse="true"> <key> <column name="sub" length="10" /> </key> <one-to-many class="VO.Producttype" /> </set> </class> </hibernate-mapping>
另个例子:Type和user是一对多的关系:set对应的 key为userId,many-to-one对应的为typeID
type.java
package VO; import java.util.Set; /** * @hibernate.class table="Type" * @author sunqitang * */ public class Type { private Integer typeId; private Integer typeName; private Set<User> users; /** * @hibernate.id generator-class="native" * @return */ public Integer getTypeId() { return typeId; } public void setTypeId(Integer typeId) { this.typeId = typeId; } /** * @hibernate.property * @return */ public Integer getTypeName() { return typeName; } public void setTypeName(Integer typeName) { this.typeName = typeName; } /** * @hibernate.set * cascade="all" * inverse="true" * @hibernate.key column="userId" * @hibernate.one-to-many class="VO.User" * @return */ public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } }
user.java
package VO; /** * @hibernate.class table="User" * @author sunqitang * */ public class User { private Integer userId; private String userName; private Type type; /** * @hibernate.id * generator-class="native" * @return */ public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } /** * @hibernate.property * @return */ public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } /** * @hibernate.many-to-one column="typeId" class="VO.Type" * @return */ public Type getType() { return type; } public void setType(Type type) { this.type = type; } }
生成的hbm为:
type.hbm.xml
<?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="Type" name="VO.Type"> <id name="typeId"> <generator class="native"/> </id> <property name="typeName"/> <set inverse="true" cascade="all" name="users"> <key column="userId"/> <one-to-many class="VO.User"/> </set> </class> </hibernate-mapping>
user.hbm.xml
<?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="User" name="VO.User"> <id name="userId"> <generator class="native"/> </id> <property name="userName"/> <many-to-one column="typeId" name="type" class="VO.Type"/> </class> </hibernate-mapping>
使用xdoclet来生成hbm文件。
<?xml version="1.0" encoding="UTF-8"?> <project name="OA系统构建脚本" default="生成hibernate映射文件" basedir="."> <property name="src.dir" value="${basedir}/src"/> <property name="build.dir" value="${basedir}/bin"/> <property name="webapp.dir" value="${basedir}/src/webapp"/> <property name="xdoclet.home" value="D:\\JAVA电子资源\\组件\\Xdoclet\\xdoclet-plugins-1.0.3\\xdoclet-plugins-1.0.3"/> <!-- Build classpath --> <path id="xdoclet.task.classpath"> <fileset dir="${xdoclet.home}/lib"> <include name="**/*.jar"/> </fileset> <fileset dir="${xdoclet.home}/plugins"> <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/babasport/VO"> <include name="**/*.java"/> </fileset> <component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" version="3.0" destdir="${src.dir}" /> </xdoclet> </target> </project>