Hibernate Synchronizer使用

由Joe Hudson編寫的一個Eclipse Plugin,和middlegen比起來,更靈活、更加與IDE集成的工具,不僅提供了一個反向提取數據庫內生成hbm的工具,而且內置了一些模板,可以生成DAO, baseClass,用戶可以把業務邏輯寫在具體子類中,保持baseClass完全可以從hbm文件生成,從而在hbm文件有所變化的時候,自動更新baseClass的定義。它也照顧了組合主鍵、枚舉值等的處理,是目前進行Hibernate開發的最有效工具之一。
要使用Hibernate Synchronizer,需要使用Eclipse的自動安裝功能(update site地址:http://www.binamics.com/hibernatesync)
連不上,從網上下了一個。
安裝後,項目的屬性列表中就多了一項內容。

注意上圖的“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

我們不需要把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

本來Tables下面應該有個package的選項,但是因爲linux下糟糕的界面,沒能顯示,但是不選擇包又不能生成,就用了之前middlegen生成的hbm文件,衰~
正常的應該是填寫password後,點擊Refresh,即可列出符合table pattern的表名。下方輸入所需要生成的Java文件的包名。在另一頁的Properties中,可以指定所有生成的hbm文件的後綴名。

生成hbm文件後,可隨時生成Java文件。右擊hbm文件,選擇Hibernate Synchronizer-> Synchronize Files,即可生成Java文件。生成的文件結構是這樣的。

可以看到,它爲每個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管理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章