J2EE劍俠行

          直覺我的J2EE應用生涯,打造我心中的一把利劍。

          導航

          <2006年7月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          留言簿(7)

          隨筆分類

          隨筆檔案

          文章檔案

          閱讀排行榜

          評論排行榜

          常用鏈接

          統(tǒng)計

          技術鏈接

          最新評論

          hibernate的延遲加載通用方法

          呵呵,在忙一個項目,潛水很久,現(xiàn)在冒個泡:
          (本文適用在struts+spring+hibernate3上做開發(fā)的蟲蟲們)
          類名:HibernateUtil

          package?com.antbee.j2eemodel.util;

          import?java.lang.reflect.InvocationTargetException;
          import?java.lang.reflect.Method;
          import?java.util.Collection;
          import?java.util.Iterator;

          import?org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          public?class?HibernateUtil?extends?HibernateDaoSupport?{

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @param?methodName?方法名稱
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object,?String?methodName)?throws?SecurityException,?NoSuchMethodException,?IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          String[]?methodArray?
          =?methodName.split("\\.");
          Method?method?
          =?null;
          Object?initializeObject?
          =?object;

          if(methodArray.length?==?1){
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          method?
          =?object.getClass().getMethod(methodArray[0],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          this.getHibernateTemplate().initialize(initializeObject);
          }
          else{
          for(int?i=0;i<methodArray.length;i++){
          method?
          =?initializeObject.getClass().getMethod(methodArray[i],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          }
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(initializeObject);
          }
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @param?methodName?方法名稱數(shù)組
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object,?String?methodName[])
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for?(int?i?=?0;?i?<?methodName.length;?i++)?{
          String[]?methodArray?
          =?methodName[i].split("\\.");
          Method?method?
          =?null;
          Object?initializeObject?
          =?object;

          if(methodArray.length?==?1){
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          method?
          =?object.getClass().getMethod(methodArray[0],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          this.getHibernateTemplate().initialize(initializeObject);
          }
          else{
          for(int?j=0;j<methodArray.length;j++){
          method?
          =?initializeObject.getClass().getMethod(methodArray[j],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          }
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(initializeObject);
          }
          }

          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object)?throws?SecurityException,?NoSuchMethodException,?IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{
          this.getHibernateTemplate().lock(object,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(object);
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?collection?POJO對象集合
          *?
          @param?methodName?方法名稱數(shù)組
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Collection?collection,?String?methodName[])
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for(Iterator?i=collection.iterator();i.hasNext()Wink{
          Object?object?
          =?i.next();
          this.initialize(object,methodName);
          }
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?collection?POJO對象集合
          *?
          @param?methodName?方法名稱
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Collection?collection,?String?methodName)
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for(Iterator?i=collection.iterator();i.hasNext()Wink{
          Object?object?
          =?i.next();
          this.initialize(object,methodName);
          }
          }
          }?

          這個方法的好外是:可以不在hbm.xml的文件當中,指定為lazy=true這個模式,可以直接使用。使用方法如下:
          如果你使用SPRING,則需要把hibernateUtil注入其中:
          ?<bean?id="hibernateUtilTarget"?class="com.antbee.j2eemodel.util.HibernateUtil">
          <property?name="sessionFactory">
          <ref?local="mssqlSessionFactory"?/>
          </property>
          </bean>

          <bean?id="hibernateUtil"?parent="BaseTransactionProxy"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
          <property?name="target">
          <ref?local="hibernateUtilTarget"?/>
          </property>
          </bean>
          <!--配置基礎事務-->
          <bean?id="BaseTransactionProxy"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"?abstract="true">
          <property?name="transactionManager">
          <ref?bean="mssqltransactionManager"?/>
          </property>
          <property?name="proxyTargetClass">
          <value>true</value>
          </property>
          <property?name="transactionAttributes">
          <props>
          <prop?key="*">PROPAGATION_REQUIRED</prop>
          </props>
          </property>
          </bean>?

          使用示例:
          如果你使用STRUTS,則需要這樣:
          List?what_ur_view?=?XXXManager.find(.);//取得你要展示的對象
          //如果這個對象當中有延遲加載的對象(SET)時,則需要如下加載就行
          this.hibernateUtil.initialize(what_ur_view,?"getTbShipmentSale");
          //其中getTbShipmentSale是其對象(SET也可以操作)?

          在頁面顯示的時候,你就可以使用JSTL如下表述:
          <c:out?value="${what_ur_view.tbShipmentSale.goodsReceivePersonPhone}"?/>//呵呵,是不是很爽呀。?

          同樣的方法,我們也可以對一個SET在頁面進行顯示,方法如下:
          <c:forEach?items="${what_ur_view.tbShipmentProductMappingSet}"?var="ProductMapping"?varStatus="status">
          <c:out?value="${ProductMapping.productNum}"?/>
          <c:out?value="${ProductMapping.tbOutOfWarehouse.outOfWarehouseNum}"?/>
          </c:forEach>
          //呵呵,支持多級嵌套,?

          在ACTION當中則需要加入
          hibernateUtil.initialize(what_ur_view.getTbShipmentProductMappingSet(),
          new?String[]?{?"getTbProduct",?"getTbOutOfWarehouse",
          "getTbProductConfigure"?});?
          呵,如果你要是在HIBERNATE當中使用,這個就太簡單了吧。

          怎么樣?呵呵呵,
          從此,我對STRUTS的標簽深惡痛絕,而對JSTL情有獨鐘了。

          posted on 2006-07-21 10:09 @家軍 閱讀(5600) 評論(2)  編輯  收藏 所屬分類: J2EE技術類

          評論

          # re: hibernate的延遲加載通用方法 2006-07-23 13:24 crazycy

          從此,我對STRUTS的標簽深惡痛絕,而對JSTL情有獨鐘了。

          同樣的感覺...
          本質都是一樣的;渴望一個標準來統(tǒng)一,JSTL出現(xiàn)并成熟了;也通用,幸事哦

            回復  更多評論   

          # re: hibernate的延遲加載通用方法[未登錄] 2008-06-14 10:40 AA

          我基本看不懂,小弟愚笨 哈哈  回復  更多評論   

          主站蜘蛛池模板: 渭源县| 错那县| 乌拉特后旗| 托克逊县| 噶尔县| 长葛市| 墨脱县| 三河市| 钟山县| 天水市| 饶平县| 夏河县| 若羌县| 凤台县| 恩平市| 类乌齐县| 东乡族自治县| 启东市| 芜湖市| 双城市| 湟源县| 兴安县| 上高县| 峡江县| 芦山县| 招远市| 喀什市| 贵州省| 海丰县| 孟州市| 明溪县| 酉阳| 长宁县| 馆陶县| 南平市| 莎车县| 娄烦县| 盖州市| 汶上县| 美姑县| 台江县|