
图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)来添加注释或优化类的生成。
A Book business object.
@author Duke
The unique ISBN code for this book.
/**
* 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;
}
}
classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
classpathref="project.class.path"/>
description="Generate Java source code
from the Hibernate mapping files">
targetfile="${maven.src.dir}/generated/hbm.jar">
value="${hibernateBuild.uptodate}"/>
classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
classpathref="maven.dependency.classpath"/>
output="${maven.src.dir}/generated/src/java" >
4.0.0
...
...
maven-antrun-plugin
generate-sources
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="maven.dependency.classpath"/>
run
在Hibernate 3中使用hbm2java
Hbm2java 工具已经经受了Hibernate 3 的考验。hbm2java任务与其它相似的任务一起,被集成进了新版Hibernate
工具集中的hibernatetool任务(撰写此文时仍是alpha版)。Ant任务需要在类路径(class path)中查找以下的.jar
文件:
? hibernate-tools.jar
? velocity-1.4.jar
? velocity-tools-generic-1.4.jar
? jtidy-r8-21122004.jar
? hibernate3.jar
? JDBC drivers
这样一来,Ant任务就要作如下申明:
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="maven.dependency.classpath"/>
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="maven.dependency.classpath"/>
注意:尽管Hibernate 3版的工具是很有前途的,但它仍只是在alpha阶段,因此使用时务必小心为是。(译注:翻译此文时最新的Hibernate版本是3.1.2,Hibernate Tools的版本是3.1 beta 4)
定制生成的Domain类
现在你知道了怎样从Hibernate映射生成Java源代码, 那么下一步呢?为了更加具体地讨论,我们将使用如图2
和3所描述的简单类模型。这个类模型表示Employee数据库。每个employee赋予一country,讲一种或多种language。每个
country 也有一组国际机场(airport)。

图2. 示例应用程序的UML类图

图3. 示例中所用的数据库模式
有时,你可能想添加域逻辑到Domain类中。实际上,对多数人来说,生成Java类的主要缺点是Domain类变得相对被动,而且把业务逻辑方法加入
生成的Domain类中并不容易,就如所论证的那样使它们更不接近“面向对象“。对这问题并没有一个万能的解决方案,但我们在此描述了一些可能的方法。
把代码放入映射文件: class-code元属性(meta attribute)
对于简单的方法,你可以用class-code元属性来在Hibernate映射文件中指定额外的Java代码。例如,假设我们想在country和
airports间建立双向关系。只要我们想增加airport属性到Country
对象,我们就要确定在Airport对象中相应地增加country属性。我们可以这么做:
true
/**
* Add an airport to this country
*/
public void addAirport(Airport airport) {
airport.setCountry(this);
if (airports == null) {
airports = new java.util.HashSet();
}
airports.add(airport);
}
]]-->
formula="(select sum(item.amount)
from item
where item.order_id = order_id)" />
true
CountryBase
protected
public class Country extends CountryBase {
/**
* Add an airport to this country
*/
public void addAirport(Airport airport) {
airport.setCountry(this);
if (getAirports() == null) {
setAirports(new java.util.HashSet());
}
getAirports().add(airport);
}
} 包装(Wrapper)或委派(Delegate)模式(Pattern)
对于更复杂的业务逻辑,你或许也想使用下列技术中的一种:
? 你可以定义“wrapper”或“delegate”类,这些类含有作为属性的Domain类,并且提供了指定域类额外的业务逻辑。
? 你可能更喜欢“服务(service)”或“外观(façade)”方法,“façade”对象(如无状态的会话EJB)提供了一套相关的业务服务来操作Domain对象。
结论
本文描述了我们用来管理Hibernate映射的一种方法, 这在我们所特定的环境中工作得很好。 当然,还有许多别的方法。或许本文会给你的项目提供一些想法,但无论你做什么, 总要使用最适合你项目的方法。
资源
? Hibernate
? Hibernate Tools
? Ant
? Hibernate Ant tool
? Maven
John Ferguson Smart从1991起涉足IT行业, 99年开始从事J2EE的开发。
版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接
原文:http://www.javaworld.com/
译文:http://www.matrix.org.cn/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/374079/viewspace-131302/ ,如需转载,请注明出处,否则将追究法律责任。