<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    人在江湖

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

    鏈接 在公司組建virtual團隊(一) 在公司組建virtual團隊(二) 大家都說沒有絕對好的技術框架,只有適合的。我覺得如果非要考量一種技術框架好壞,可以從兩個方面看,一看是否幫助程序員productive,二看是否靈活,適合實現細粒度的功能。通常這兩個方面互相矛盾。就好象NBA里力量和速度是兩個重要的身體素質指標。但是力量越好的,往往速度越差。NBA里最NB的往往是這兩方面協調的比較好的,比如很多人力量比小皇帝詹姆斯好,也有很多人速度比他快。但力量比他大的,速度都不如他;速度比他快的力量肯定比他差遠了。這就是一個天賦球員。

    持久層可以用spring JDBC template, iBatis, Hibernate,當然還有很多我不了解的。哦,別忘了還有ROO, 它也包含持久層的實現,或者說,是很酷地封裝了其他框架的實現。

    對我來說,足夠productive的,只有Hibernate和ROO。跑了一遍ROO的PizzaShop的例子,真是太酷了。以前在Oracle的時候用過一個支持快速開發的產品叫Html DB,也很棒,但是ROO更透明,也更優雅。ROO主要基于annotation和aspectj。生成一個簡單的應用,只用10條左右的命令。從理論上說,ROO也適合控制細粒度的功能,可惜我不熟aspectJ以及它所采用的前端的技術,猶豫了一下還是覺得走這條路風險太大。但我非常看好ROO的發展,以后有時間要好好研究一下。喜歡ROO的另一個原因是,它生成的是Rich Model, 即使使用Hibernate.

    Hiberante也是我很喜歡的技術,兩個原因,一是喜歡它transparent persistence的定位。二是它強調fine grained class,合俺胃口。Gavin在他的Hibernate書里(書可以從分享十二本經典電子書這篇里找到)介紹了基于Hibernate做持久層的一個思路,很棒,如果說更具體的代碼實現,可以看SpringSide2。事實上很多人現在都在采用這種方式封裝持久層。

    Spring提供了HibernateDaoSupport類對Hibernate支持,DAO類繼承了這個類之后,可以方便地得到HiberanteTemplate, 它的好處在于封裝了對session的管理,另外它也參與集成了對transaction的管理。SpringSide2主要基于HibernateDaoSupport和一些其他的技巧,實現了很薄的DAO層,基本上薄到沒有DAO層了。

       1: @Service
       2: public class BoardManager extends HibernateEntityDao<Board>{
       3: }

    上面這么一個空manager類,里面已經包含關于Board類的CRUD的功能了,Board類是映射數據庫的一個貧血實體類。

    我幾乎沒有改SpringSide2對于Hibernate的封裝,改動只包含兩種:一種是把eclipse報warning給@SuppressWarnings(“unchecked”)掉了 另一種是把中文注釋翻譯成英文了。涉及到的java類在博客的最后有下載鏈接

    我們具體看看是怎么做到的。

    先寫個DAO的基類,叫做HibernateGenericDao。這個類對泛型或Object類封裝了CRUD的操作,以保證不依賴某個具體的實體類,看具體例子就能明白大體是怎么回事了

       1: public <T> T get(Class<T> entityClass, Serializable id) {
       2:     return (T) getHibernateTemplate().load(entityClass, id);
       3: }
       4:  
       5: public void remove(Object o) {
       6:     getHibernateTemplate().delete(o);
       7: }
       8:  
       9: public <T> void removeById(Class<T> entityClass, Serializable id) {
      10:     remove(get(entityClass, id));
      11: }

    這個類還有一個有技巧的地方在于:

       1: public <T> List<T> getAll(Class<T> entityClass, String orderBy, boolean isAsc) {
       2:     Assert.hasText(orderBy);
       3:     if (isAsc)
       4:         return getHibernateTemplate().findByCriteria(
       5:                 DetachedCriteria.forClass(entityClass).addOrder(Order.asc(orderBy)));
       6:     else
       7:         return getHibernateTemplate().findByCriteria(
       8:                 DetachedCriteria.forClass(entityClass).addOrder(Order.desc(orderBy)));
       9: }

    這里使用了DetachedCriteria. DetachedCriteria和Criteria有共同的父類。兩者的區別在于Criteria是在線的,而DetachedCreteria是離線的,也就是沒有session. 這樣正好可以用HibernateTemplate的session.

    繼續… 再寫一個子類:

       1: public class HibernateEntityDao<T> extends HibernateGenericDao

    在子類中,終于把泛型去掉了,舉例:

       1: protected Class<T> entityClass;// entity type that DAO manages
       2:  
       3: public HibernateEntityDao() {
       4:     entityClass = GenericsUtils.getSuperClassGenricType(getClass());
       5: }
       6:  
       7: protected Class<T> getEntityClass() {
       8:     return entityClass;
       9: }
      10:  
      11: public T get(Serializable id) {
      12:     return get(getEntityClass(), id);
      13: }

    這里的關鍵在于GenericsUtils.getSuperClassGenericType(getClass())

    最終調用到的code是:

       1: public static Class getSuperClassGenricType(Class clazz, int index) {
       2:  
       3:     Type genType = clazz.getGenericSuperclass();
       4:  
       5:     if (!(genType instanceof ParameterizedType)) {
       6:         log.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
       7:         return Object.class;
       8:     }
       9:  
      10:     Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
      11:  
      12:     if (index >= params.length || index < 0) {
      13:         log.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
      14:                 + params.length);
      15:         return Object.class;
      16:     }
      17:     if (!(params[index] instanceof Class)) {
      18:         log.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
      19:         return Object.class;
      20:     }
      21:     return (Class) params[index];
      22: }

    略作說明:

    傳進來的參數是org.emoticon.forum.manager.BoardManager

    genType是org.emoticon.core.persistence.HibernateEntityDao<org.emoticon.forum.model.Board>

    返回值是Board.

    通過這種方式,就實現了之前說的:

     

       1: public class RoleManager extends HibernateEntityDao<Role> {
       2:  
       3: }

    空manager類自動獲得CRUD的功能

    具體代碼可以從這里下載:

    http://cid-d8b11f9bf86fecfa.office.live.com/self.aspx/.Public/code/HibernateWrapper.zip

    posted on 2011-03-07 00:00 人在江湖 閱讀(1479) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 国产无遮挡裸体免费视频| 亚洲色偷偷色噜噜狠狠99| 免费一级毛片在线播放不收费 | 成人黄页网站免费观看大全| 免费观看久久精彩视频| 深夜特黄a级毛片免费播放| 亚洲电影在线免费观看| 亚洲女久久久噜噜噜熟女| 亚洲AV伊人久久青青草原| 在线观看视频免费国语| 亚洲视频免费一区| 国产成人精品无码免费看 | 国产jizzjizz视频全部免费| 四虎最新永久免费视频| 日韩成人免费视频| 在线免费观看伊人三级电影| 免费一级毛片在线播放视频免费观看永久| 精品久久亚洲中文无码| 亚洲的天堂av无码| 亚洲人成网站在线播放影院在线| 亚洲精品理论电影在线观看 | 91禁漫免费进入| 四虎影视在线影院在线观看免费视频| 国产高清对白在线观看免费91| 久久精品国产亚洲AV电影网| 亚洲最大无码中文字幕| 亚洲午夜一区二区三区| 亚洲人成人77777网站不卡 | 国产a视频精品免费观看| 久久国产免费一区二区三区| 国产99视频精品免费专区| 免费无码av片在线观看| 免费av片在线观看网站| 欧洲精品99毛片免费高清观看| 免费人成毛片动漫在线播放| 男女午夜24式免费视频 | 久久久婷婷五月亚洲97号色| 亚洲今日精彩视频| 久久精品蜜芽亚洲国产AV| 亚洲美女在线观看播放| 亚洲一区二区三区无码国产|