由Joe Hudson编写的一个Eclipse Plugin,和middlegen比起来,更灵活、更加与IDE集成的工具,不仅提供了一个反向提取数据库内生成hbm的工具,而且内置了一些模板,可以生成DAO, baseClass,用户可以把业务逻辑写在具体子类中,保持baseClass完全可以从hbm文件生成,从而在hbm文件有所变化的时候,自动更新baseClass的定义。它也照顾了组合主键、枚举值等的处理,是目前进行Hibernate开发的最有效工具之一。
要使用Hibernate Synchronizer,需要使用Eclipse的自动安装功能(update site地址:http://www.binamics.com/hibernatesync)
连不上,从网上下了一个。
安装后,项目的属性列表中就多了一项内容。
220253197.png

注意上图的“I would like to have the synchronization…”这一项,是否自动根据hbm的变化而同步Java类。若打勾,每当编辑hbm后,会自动重新生成base类。也正因为这个功能需要Eclipse能辨认出特定的hbm配置文件,因此默认生成的hbm文件的后缀不再是.hbm.xml,而是.hbm。假若一定需要hbm.xml后缀的话,自动更新功能就无法使用,需要每次手动更新。
把Mysql的JDBC驱动加到项目的类路径,然后新建->Hibernate->Hibernate Configuration File

220345122.png

我们不需要把Session Factory绑定到JNDI, 因此不用填写SessionFactory Name。
建议把hibernate.cfg.xml放入src目录,这样在编译时,Hibernate会把它copy到bin目录,即放入类路径,在执行new Configuration().configure()的时候,即可自动采用。
Database Tye决定采用哪一种dialect。再下面的Connection区填写相关连接信息,即可生成cfg.xml文件。

第二步,生成hbm文件。新建->Hibernate->Hibernate Mapping File

220443464.png

本来Tables下面应该有个package的选项,但是因为linux下糟糕的界面,没能显示,但是不选择包又不能生成,就用了之前middlegen生成的hbm文件,衰~
正常的应该是填写password后,点击Refresh,即可列出符合table pattern的表名。下方输入所需要生成的Java文件的包名。在另一页的Properties中,可以指定所有生成的hbm文件的后缀名。

生成hbm文件后,可随时生成Java文件。右击hbm文件,选择Hibernate Synchronizer-> Synchronize Files,即可生成Java文件。生成的文件结构是这样的。

220541299.png

可以看到,它为每个hbm文件都生成了一个Base前缀的基类,以及对应的DAO类,同样DAO类也有基类。这样的好处是,把用户后来另外增加的操作代码和可以自动生成的代码分开,用户不应该修改base包下面的内容,只要hbm文件有了更新,随时都可以自动或者手动同步生成Base基类。
DAO则提供了一些操作上便利,还把对session的save,update,delete等操作转移到DAO中,以及提供更多的find方法。这对于项目标准化有所帮助,至于是否采用它这样的组织方式,可以自己选择;甚至可以自己编写vm模板文件,Hibernate Synchronizer也会笑纳(?),欣然采用你自己的vm模板生成代码。在http://www.binamics.com/hibernatesynch/templates/(网址还有用么??), 可以找到通过Hibernate Synchronizer生成Struts文件的例子。

《深入浅出Hibernate》书中的一种说明:实际上,在Hibernate环境中,不使用DAO是更为简单的方法,因为Hibernate提供了直接针对实体的生命周期管理,本身就完成了这一解耦的任务,适用DAO反而造成了代码的繁琐和零乱。假若与Hibernate同时使用DAO,目前可能站的住脚的原因就是为了抽象Hibernate本身,而这一点随着EJB3的推进,意义会随之减弱。

进行test

public class UserDAOTest extends TestCase {
    private Session session;
              
    protected void setUp() throws HibernateException {
        Configuration cfg = new Configuration().configure();
        session = cfg.buildSessionFactory().openSession();
    }
              
    protected void tearDown() throws Exception {
        session.close();
    }
              
    public void testUserCRUD() throws HibernateException {
        //创建DAO
        UserDAO userDAO = (UserDAO) UserDAO.getInstance();
        User user = new User();//创建实例
        user.setName("Lily");
        user.setPwd("Pwd111");
        userDAO.save(user, session);//使用DAO进行操作
                  
        User user2 = userDAO.load(user.getId(), session);//读取第二个对象
        assertEquals("Lily", user2.getName());
        assertEquals("Pwd111", user2.getPwd());
                  
        user2.setPwd("Pwd222");//进行一些修改
        userDAO.saveOrUpdate(user2, session);
                  
        user = userDAO.load(user.getId(), session);//更新第一个对象
        assertEquals("Pwd222", user.getPwd());
                  
        userDAO.delete(user, session);//删除
                  
    }
}

运行的时候才发现自动生成的cfg.xml没有DOCTYPE,衰~,show_sql默认false。
和文中的包不一样,书里没有dao.iface这个包,然后有两个UserDAO类,就随便用了,运行成功就好~

真正的业务逻辑应该用Proxy模式隐藏DAO创建。更好的方式当然是用Spring这样的Bean Factory管理。