网站导航:首页 -> JAVA认证 -> JAVA认证考试题库 -> 用hbm2java生成Hibernate类

用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任务看起来就象是: