Xdoclet 基本概念
我们可以在 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>
本文介绍如何利用Xdoclet工具从Java类注释自动生成Hibernate映射文件。通过具体示例展示了如何定义注释以实现不同类型的关联关系,并提供了一个Ant构建脚本来批量生成映射文件。
499

被折叠的 条评论
为什么被折叠?



