用hbm2java生成Hibernate类
对于管理hiberante 映射文件,现有多种策略, 如:
· 一切手工编写
· 把xdoclet标记放在你的java 类中, 让其生成相应的映射文件。
· 从sql 模式(schema)生成hibernate 映射文件和java类。
· 手工编写hibernate 映射文件, 并且从hibernate 映射生成java类和sql模式。
· 基于给定的sql 模式,手工编写hibernate 映射文件,并利用hbm2java工具生成java类。
在本文中, 我们会着眼于上述方法中的最后那种方法。尽管这样的选择通常只是约略的尝试, 但此方法的确在多数情况下有许多优势:
· hibernate 映射集中在映射文件中,而不是把这些信息散布在java源代码中,这使维护变得更加容易。在某些情况下,xdoclet annotation 不支持所有在hibernate映射模式中可用的功能,你还可通过映射获得更好的控制。
· 数据库模式可分开来维护,而不是从java 类或hibernate映射文件生成。这允许那些对java/hibernate不甚了 解的数据库 管理员(dba)对数据库细节(索引,表空间,表类型等)本身有更好的控制。
由映射文件生成java类 这种方式下,hibernate映射文件主导着一切。所有的映射信息都集中在这些文件中, 就意味着不会在源代码中使用annotations。所有的持久化类都由hbm2java工具生成。之后,那些类就不能被修改。
此过程如图1所示。首先,你持有一组hibernate映射文件。你或许也需要一个hbm2java配置文件,通常称之为hbm2java.xml。利用这两个引子,hbm2java工具为每个hibernate映射文件生成一个或多个java类。hbm2java配置文件对类生成过程的优化是有用的。

图1.用hbm2java工具将hibernate映射生成java类
一个简单类生成的例子
让我们从一个非常简单的例子开始。假设我们想映射一个book的简单数据库表,表结构定义如下:
column | type | modifiers
-----------+-----------------------+-----------
book_id | character(32) | not null
book_title | character varying(80) | not null
book_isbn | character varying(20) | not null
为了生成这个类, 我们可以使用以下的hiberante映射文件。注意怎样利用元属性(meta-attriute)来添加注释或优化类的生成。
<?xml version='1.0'?>
<hibernate-mapping>
<class name='book' table='book'>
<meta attribute='class-description'>
a book business object.
@author duke
</meta>
<id name='id' type='string' unsaved-value='null' >
<column name='book_id' sql-type='char(32)' not-null='true'/>
<generator class='uuid.hex'/>
</id>
<property column='book_name' name='name'/>
<property column='book_isbn' name='isbn'>
<meta attribute='field-description'/>
the unique isbn code for this book.
</meta>
</property>
</class>
</hibernate-mapping>
使用此映射文件,hbm2java会生成看起来象这样的类:
/**
* a book business object.
* @author duke
*/
public class book {
private string id;
private string name;
private string isbn;
public book() {
}
public string getid() {
return id;
}
private void setid(string id) {
this.id = id;
}
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
/**
* the unique isbn code for this book.
*/
public string getisbn() {
return isbn;
}
public void setisbn(string isbn) {
this.isbn = isbn;
}
}
为实际项目生成类 实际上,hbm2java被设计成用来把hibernate映射文件转化成一组相应的java类。如果你想在实际的应用程序中使用这种方法,很显然,对于所有的hibernate映射文件一次性生成类会更为方便。最好的方法是把类生成结合进你的自动化构建过程中。结合进ant构建过程中使用ant调用hbm2java是相当直接的。首先,你需要申明hbm2java任务(task)以便ant可以调用它:
<taskdef name='hbm2java'
classname='net.sf.hibernate.tool.hbm2java.hbm2javatask'
classpathref='project.class.path'/>
接着,你要用到这个任务。例如,通过写一个目标(target)将源目录中的所有*.hbm.xml文件生成源代码。假设${src.hibernate}表示含有hibernate映射文件的目录,${src.generated}就是你想放源代码的地方。这样ant任务看起来就象是: