其它技术和Hibernate-XDoclet

原创 2004年02月29日 13:23:00

其它技术和Hibernate-XDoclet

使用Hibernate,对实体类,需要Map 文件,XDoclet在写类时加入类似Javadoc的@hibernate.xxx 指示,然后用XDoclet自动生成Map 文件,使写程序更加方便。

使用XDoclet一般使用Ant,在build.xml中加入XDoclet的部分。XDoclet需要有相应的jar文件支持,不过,因为XDoclet是在Ant运行时使用的,所以XDoclet的jar可以不放在webapps/../WEB-INF/lib下,可另外放一个目录(有时XDoclet的jar会和其它的jar冲突)

从XDoclet网上下 xdoclet.zip 或tar.gz,可放在一个单独的目录,如lib-xdoc下,一般需要:(以1.2版本为例)

  • xdoclet-1.2.jar
  • xdoclet-xdoclet-module-1.2.jar
  • xdoclet-hibernate-module-1.2.jar
  • xjavadoc-1.0.2.jar

其它的通用的jar,Hibernate等也用到,如commons-logging-x.x.x.jar,xerces-x.x.x.jar,可放在lib目录下。

目录结构WEB-INF

  • lib
  • lib-xdoc
  • src
  • classes
  • build.xml
  • web.xml

这样,在Ant 的build.xml中同时加入lib 和 lib-xdoc下的jars,编译时用到 XDoclet,运行时就不用XDoclet了。

build.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="Test" default="compile" basedir=".">
   <property name="classes" location="./classes"/>
   <property name="src" value="src" />
   <property name="db" value="db" />
   <property name="lib" value="lib" />
   <property name="lib-xdoc" value="lib-xdoc" />
   <property name="build" value="classes" />
   <path id="myclasspath">
    <fileset dir="${lib}">
     <include name="*.jar"/>
    </fileset>
    <fileset dir="${}">
     <include name="*.jar"/>
    </fileset>
   <pathelement location="${build}"/>
   </path>
   <target name="init">
   <mkdir dir="${classes}"/>
   </target>
   <target name="compile" depends="init">
   <javac executable="jikes" classpathref="myclasspath"    srcdir="${src}" destdir="${classes}"/>
   </target> 
   <target name="clean">
   <delete dir="${classes}"/>
   </target>
   <target name="" description="Generates Hibernate class    descriptor files.">
     <taskdef name="hibernatedoclet"
      classname="xdoclet.modules.hibernate.HibernateDocletTask">
      <classpath refid="myclasspath"/>
     </taskdef>
     <hibernatedoclet
      destdir="${classes}"
      excludedtags="@version,@author,@todo"
      force="true"
      verbose="true">
      <fileset dir="${src}">
       <include name="**/*.java"/>
      </fileset>
     <hibernate version="2.0"/>
   </hibernatedoclet> 
   </target>
   <!-- Other target omited -->
</project>
  

使用XDoclet 的例子:

例1.Org.java 表示一个公司的各个组织,组成一个树形结构,就是一个Org 可能有一个父的Org

用many-to-one/one-to-many,用同一个column(parent) 指向本身(bean.Org),有一个用inverse

package  bean;
import java.util.*;
/**
* @hibernate.class table="test_org"
*/
public class Org extends Persistent{ //注:id在Persistent中
private String name;
private Org parent;
private Set children=new TreeSet();
/**
* @hibernate.property length="60"
*/
public String getName(){
return name;
}
public void setName(String value){
name=value;
}
/**
* @hibernate. class="bean.Org" column=""
*/
public Org getParent(){
return parent;
}
public void setParent(Org value){
parent=value;
}
/**
* @hibernate.set ="true" lazy="true" cascade="all"
* @hibernate.collection-key column=""
* @hibernate.collection- class="bean.Org"
*/
public Set getChildren(){
return children;
}
public void setChildren(Set value){
children=value;
}
}

Persistent.java

package bean;
import net.sf.hibernate.Validatable;
import net.sf.hibernate.ValidationFailure;


/**
  * @hibernate.class table="test_persistent"
  */
public class Persistent implements Validatable{
  protected int id;
  /**
  * @hibernate.id generator-class="increment" type="int" unsaved-value="null"
  */
  public int getId() {
     return id;
  }
  public void setId(int id) {
     this.id = id;
  }
  public void validate() throws ValidationFailure {
} }

自动生成的Map 文件如下:

Org.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class
name="bean.Org"
table="test_org"
dynamic-update="false"
dynamic-insert="false">
<id
name="id"
column="id"
type="int"
unsaved-value="null">
<generator class="increment">
</generator>
</id>
<property
name="name"
type="java.lang.String"
update="true"
insert="true"
column="name"
length="60"/>
<many-to-one
name="parent"
class="bean.Org"
cascade="none"
outer-join="auto"
update="true"
insert="true"
column="parent"/>
<set
name="children"
lazy="true"
inverse="true"
cascade="all"
sort="unsorted">
<key
column="parent"/>
<one-to-many
class="bean.Org"/>
</set>
</class>
</hibernate-mapping>

例2.用户(User)和职位(Position),一个用户可有多个职位,可用many-to-may 关系

用的表是同一个(test_user_position),在Position中用"inverse",实现双向关联(Bidirectional Associations)

Users.java:

package  bean;
import java.util.*;
/**
* @hibernate.class table="test_user"
*/
public class User extends Persistent{ //......
private Set positions=new TreeSet();
/**
* @hibernate.set table="" lazy="true"
* @hibernate.collection-key column=""
* @hibernate.collection- class="bean.Position" column=""
*/
public Set getPositions(){
return positions;
}
public void setPositions(Set value){
positions=value;
}
}

Position.java

package  bean;
import java.util.*;
/**
* @hibernate.class table="test_position"
*/
public class Position extends Persistent{
//......
private Set users=new TreeSet();
/**
* @hibernate.set ="true" lazy="true" table=""
* @hibernate.collection-key column=""
* @hibernate.collection- class="bean.User" column=""
*/
public Set getUsers(){
return users;
}
public void setUsers(Set value){
users=value;
}
}

小结:

使用XDoclet,可方便生成Hibernate 的Map文件,加快开发。

注意事项:使用双向关联(Bidirectional Associations)时相应的column一定要正确,否则XDoclet不会报错,但是生成的数据库表不正确。

参考:

Hibernate 主站:www.hibernate.org

Hibernate Xdoclet:http://www.chinaunix.net/jh/26/92019.html

XDoclet 主站:http://xdoclet.sourceforge.net/

 

关于直播,所有的技术细节都在这里了

前言: 网络视频直播存在已有很长一段时间,随着移动上下行带宽提升及资费的下调, 视频直播被赋予了更多娱乐和社交的属性,人们享受随时随地进行直播和观看, 直播的打开时间和延迟变成了影响产品功能发展...
  • wu5215080
  • wu5215080
  • 2017年02月06日 15:21
  • 1147

知名技术团队博客

国内技术团队博客 1  http://tech.meituan.com/ 美团点评技术团队 2  http://fe.meituan.com/   美团前端技术团队 3  http://tech...
  • u010689306
  • u010689306
  • 2016年06月10日 10:17
  • 5177

web项目技术选型

服务器:阿里云ecs+rds centos6 nginx java 1.7 tomcat7(支持servlet3.1)(tomcat8对jstorm支持不好) mysql spring spr...
  • matthewei6
  • matthewei6
  • 2016年01月13日 22:25
  • 4015

HTML5技术简介

1. 介绍 HTML是超文本标记语言的英文缩写,这是一种标记语言,不需要进行编译,直接由浏览器执行。HTML文件是一个文本文件,包含了一些HTML元素、标签等。目前HTML语言最新版本为4,W3C发...
  • aa_moon
  • aa_moon
  • 2016年12月02日 15:49
  • 1432

全栈必备的技术栈设想

参加今年的SDCC确实挺高兴的,向大师Joe Armstrong 当面求教,与周爱民老师同台,在我们的架构师进阶之路专场有4个七零后的老码农,瞬间没有了孤独感,甚至有一点窃窃之喜,本人这次分享的内容是...
  • wireless_com
  • wireless_com
  • 2016年11月20日 09:53
  • 21910

我为什么写技术博客

我为什么写技术博客今天和新室友童鞋一块吃饭,想起一年半前刚考上研究生时萌生并坚持至今的一个念头:技术博客是一名潜在工程师的必备素养。趁着喝高了点,我就坦诚地讲讲我为什么写博客。 第一,好东西,自然要...
  • NNNNNNNNNNNNY
  • NNNNNNNNNNNNY
  • 2016年09月26日 00:34
  • 883

2016年我所涉足的技术栈大盘点

为移动APP提供数据支持REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding...
  • yagas
  • yagas
  • 2017年02月03日 23:45
  • 806

java综合技术分享

1:心跳机制 1.1心跳包机制   跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,...
  • zc529739024
  • zc529739024
  • 2017年02月17日 19:01
  • 1513

Android十大常用技术揭秘-挑战

Android四大组件 http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html   三级缓存 可以用我们上课讲的说 也可以...
  • ljx19900116
  • ljx19900116
  • 2015年10月31日 19:08
  • 2145

图像识别技术浅析

[简要]1、概述自动图像识别系统的过程分为五部分:图像输入、预处理、特征提取、分类和匹配,其中预处理又可分为图像分割、图像增强、二值化和细化等几个部分。(1)图像输入将图像采集下来输入计算机进行处理是...
  • joemell
  • joemell
  • 2014年05月15日 17:02
  • 1744
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:其它技术和Hibernate-XDoclet
举报原因:
原因补充:

(最多只允许输入30个字)