生成代码
这很可能是您一直期待的部分。我们可以做些什么特别的呢?马上就有一个可用于Hibernate映射文档的新上下文菜单项。
如果右击(或控制单击)任意一项,将会看到很多与Hibernate相关的选项(图17),其中包括一个同步选项。这是一种手动让Hibernate Synchronizer生成与映射文档相关的数据访问对象的方式。

图17.映射文档的同步选项
Add Mapping Reference选项也很有用:它在主Hibernate配置文件中添加了一项,告知有关该映射文档的信息,所以无需在源代码中加入任何内容来要求配置相应的映射。现在我们来看看选择Synchronize Files的结果。
到这里事情开始变得有趣了。出现了两个新的子包,一个用于Hibernate Synchronizer“拥有的”“基”数据访问对象,可以在任何时候进行改写,而另一个用于为这些DAO生成子类的业务对象,它不会被重写,这为我们提供了一个向数据类添加业务逻辑的机会(如图18所示)。

图18. 经过同步的数据访问对象,显示了可编辑的子类
这样生成的类比使用常规的Hibernate代码生成工具生成的类要多很多,这有一些优点以及一些潜在的缺点,在稍后的权衡部分中我们将讨论这些。还要注意,可以在项目的属性配置中选择生成其中的哪些类,以及生成它们的包结构。我本来应该演示一下的,但是当前的插件版本有一个bug,它阻止了在Mac OS X上对这个配置界面进行访问。补丁已经开发出来了,但尚未发布。
基于Hibernate Synchronizer页面上的例子与下面的类,我试图使用这些新的数据访问对象插入一些数据到音乐数据库中。这十分类似于使用标准Hibernate代码生成器的版本(在Hibernate: A Developer's Notebook一书的39-40页),甚至更为简单,因为Hibernate Synchronizer生成的类针对每项数据库操作都创建并提交了一个新事务,所以在像这样简单的场境中,您不需要编写代码来设置事务。(当然了,要让一组操作作为单个事务运行,有很多种方法。)下面是新版本的代码:
package com.oreilly.hh;
import java.sql.Time;
import java.util.Date;
import net.sf.hibernate.HibernateException;
import com.oreilly.hh.dao.TrackDAO;
import com.oreilly.hh.dao._RootDAO;
/**
* Try creating some data using the Hibernate Synchronizer approach.
*/
public class CreateTest2 {
public static void main(String[] args) throws HibernateException {
// Load the configuration file
_RootDAO.initialize();
// Create some sample data
TrackDAO dao = new TrackDAO();
Track track = new Track("Russian Trance", "vol2/album610/track02.mp3",
Time.valueOf("00:03:30"), new Date(), (short)0);
dao.save(track);
track = new Track("Video Killed the Radio Star",
"vol2/album611/track12.mp3", Time.valueOf("00:03:49"), new Date(),
(short)0);
dao.save(track);
// We don't even need a track variable, of course:
dao.save(new Track("Gravity's Angel", "/vol2/album175/track03.mp3",
Time.valueOf("00:06:06"), new Date(), (short)0));
}
}

