JAVA

          人生若只如初見,何事秋風(fēng)悲畫扇。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            50 隨筆 :: 25 文章 :: 157 評論 :: 0 Trackbacks

           PO即 Persistence Object
            VO即 Value Object

           VO和PO的主要區(qū)別在于:
            VO是獨(dú)立的Java Object。
            PO是由Hibernate納入其實(shí)體容器(Entity Map)的對象,它代表了與數(shù)據(jù)庫中某條記錄對應(yīng)的Hibernate實(shí)體,PO的變化在事務(wù)提交時(shí)將反應(yīng)到實(shí)際數(shù)據(jù)庫中。

           實(shí)際上,這個(gè)VO被用作Data Transfer Object,即所謂的DTO。想必,VO就是Data Access Object ---DAO了啦。為什么要有這二者之分呢?如在傳統(tǒng)的MVC架構(gòu)中,位于Model層的PO,是否允許被傳遞到其他層面。由于PO的更新最終將被映射到實(shí)際數(shù)據(jù)庫中,如果PO在其他層面(如View層)發(fā)生了變動(dòng),那么可能會(huì)對Model層造成意想不到的破壞。

           主要想說的還是如何進(jìn)行二者之間的轉(zhuǎn)換:
            屬性復(fù)制可以通過Apache Jakarta Commons Beanutils(http://jakarta.apache.org/commons/beanutils/)組件提供的屬性批量復(fù)制功能,避免繁復(fù)的get/set操作。down下來之后,里面的API DOC一應(yīng)俱全。

           對于一些無需處理其它處理(如過濾)直接用BeanUtilsBean.copyProperties方法,其參考如下:

          public static void copyProperties(java.lang.Object dest,
          ????????????????????????????????? java.lang.Object orig)
          ?????????????????????????? throws java.lang.IllegalAccessException,
          ????????????????????????????????? java.lang.reflect.InvocationTargetExceptioCopy property values from the origin bean to the destination bean for all cases where the property names are the same.


          ?
            范例1:

          TUser?user? = ? new ?TUser();
          TUser?anotherUser?
          = ? new ?TUser();
          user.setName(
          " Emma " );
          user.setUserType(
          1 );
          try ? {
          BeanUtils.copyProperties(anotherUser,user);
          System.out.println(
          " UserName?=>? "
          + anotherUser.getName()
          );
          System.out.println(
          " UserType?=>? "
          + ?anotherUser.getUserType()
          );
          }
          ? catch ?(IllegalAccessException?e)? {
          e.printStackTrace();
          }
          ? catch ?(InvocationTargetException?e)? {
          e.printStackTrace();
          }
           



           也可以利用其中的一些方法在copy屬性的時(shí)候達(dá)到自己的要求,如:

           范例2

          /** //*
          ?*?Created?on?2006-4-26
          ?
          */

          package ?com.util;

          import ?java.beans.PropertyDescriptor;
          import ?java.util.Collection;

          import ?org.apache.commons.beanutils.PropertyUtils;


          /** ? */ /**
          ?*?CopyUtil
          ?*?
          @author ?Jkallen
          ?
          */

          public ? class ?CopyUtil? {
          ????
          ????
          /** ? */ /**
          ?????*?Copy?properties?of?orig?to?dest
          ?????*?Exception?the?Entity?and?Collection?Type
          ?????*?
          @param ?dest
          ?????*?
          @param ?orig
          ?????*?
          @return ?the?dest?bean
          ?????
          */

          ????
          public ? static ?Object?copyProperties(Object?dest,?Object?orig)? {
          ????????
          if ?(dest? == ? null ? || ?orig? == ? null )? {
          ????????????
          return ?dest;
          ????????}

          ????????
          ????????PropertyDescriptor[]?destDesc?
          = ?PropertyUtils.getPropertyDescriptors(dest);
          ????????
          try ? {
          ????????????
          for ?( int ?i? = ? 0 ;?i? < ?destDesc.length;?i ++ )? {
          ????????????????Class?destType?
          = ?destDesc[i].getPropertyType();
          ????????????????Class?origType?
          = ?PropertyUtils.getPropertyType(orig,?destDesc[i].getName());
          ????????????????
          if (destType? != ? null ? && ?destType.equals(origType)
          ????????????????????????
          && ? ! destType.equals(Class. class ))? {
          ????????????????????
          if ( ! Collection. class .isAssignableFrom(origType)) {????????????????????
          ????????????????????????
          try {
          ????????????????????????????Object?value?
          = ?PropertyUtils.getProperty(orig,?destDesc[i].getName());
          ????????????????????????????PropertyUtils.setProperty(dest,?destDesc[i].getName(),?value);
          ????????????????????????}
          catch (Exception?ex) {????????????????????????????
          ????????????????????????}

          ????????????????????}

          ????????????????}

          ????????????}

          ????????????
          ????????????
          return ?dest;
          ????????}
          catch (Exception?ex)? {
          ????????????
          throw ? new ?CopyException(ex);
          // ????????????return?dest;
          ????????}

          ????}
          ????
          ????
          ????
          /** ? */ /**
          ?????*?Copy?properties?of?orig?to?dest
          ?????*?Exception?the?Entity?and?Collection?Type
          ?????*?
          @param ?dest
          ?????*?
          @param ?orig
          ?????*?
          @param ?ignores
          ?????*?
          @return ?the?dest?bean
          ?????
          */

          ????
          public ? static ?Object?copyProperties(Object?dest,?Object?orig,?String[]?ignores)? {
          ????????
          if ?(dest? == ? null ? || ?orig? == ? null )? {
          ????????????
          return ?dest;
          ????????}

          ????????
          ????????PropertyDescriptor[]?destDesc?
          = ?PropertyUtils.getPropertyDescriptors(dest);
          ????????
          try ? {
          ????????????
          for ?( int ?i? = ? 0 ;?i? < ?destDesc.length;?i ++ )? {
          ????????????????
          if ?(contains(ignores,?destDesc[i].getName()))? {
          ????????????????????
          continue ;
          ????????????????}

          ????????????????
          ????????????????Class?destType?
          = ?destDesc[i].getPropertyType();
          ????????????????Class?origType?
          = ?PropertyUtils.getPropertyType(orig,?destDesc[i].getName());
          ????????????????
          if (destType? != ? null ? && ?destType.equals(origType)
          ????????????????????????
          && ? ! destType.equals(Class. class ))? {
          ????????????????????
          if ( ! Collection. class .isAssignableFrom(origType)) {
          ????????????????????????Object?value?
          = ?PropertyUtils.getProperty(orig,?destDesc[i].getName());
          ????????????????????????PropertyUtils.setProperty(dest,?destDesc[i].getName(),?value);
          ????????????????????}

          ????????????????}

          ????????????}

          ????????????
          ????????????
          return ?dest;
          ????????}
          catch (Exception?ex)? {
          ????????????
          throw ? new ?CopyException(ex);
          ????????}

          ????}

          ????
          ????
          static ? boolean ?contains(String[]?ignores,?String?name)? {
          ????????
          boolean ?ignored? = ? false ;
          ????????
          for ?( int ?j? = ? 0 ;?ignores? != ? null ? && ?j? < ?ignores.length;?j ++ )? {
          ????????????
          if ?(ignores[j].equals(name))? {
          ????????????????ignored?
          = ? true ;
          ????????????????
          break ;
          ????????????}

          ????????}

          ????????
          ????????
          return ?ignored;
          ????}

          }


            

            可以看到,在范例1中通過方法copyProperties的時(shí)候,二者之間在的屬性名必須相同(Copy property values from the origin bean to the destination bean for all cases where the property names are the same)。而在范例2中通過
          ?  Object value = PropertyUtils.getProperty(orig, destDesc[i].getName());
          ?   PropertyUtils.setProperty(dest, destDesc[i].getName(), value);
            也是將源與目的之間copy相同的屬性名。而VO是在前臺(tái)顯示,所以難免會(huì)用到PO中所不存在的屬性值。比如PO中可能是一個(gè)對象,而VO中則可能是此對象的全部屬性。其中的一些轉(zhuǎn)換則需要依據(jù)前臺(tái)需?要針對性地處理啦!
          ?????????在copy的過程中,若實(shí)體中存在一對多,多對多等關(guān)系,則DTO中也應(yīng)該存在此關(guān)系,此時(shí)不能直接將內(nèi)部的DTO or List(一對多)里面的數(shù)據(jù)一次性全部拷過去,這時(shí)應(yīng)該對每個(gè)DTO進(jìn)行copy,當(dāng)然,若在前臺(tái)你無需用到相關(guān)的DTO則可以跳過。而對于一對多(LIST),而應(yīng)將實(shí)體里面的每個(gè)一對多轉(zhuǎn)換成對應(yīng)的DTO,再依次放到LSIT里面,再將此LIST賦值給(父)DTO,這里面的關(guān)系如同(一個(gè)簡單的)遞歸關(guān)系。---更新于5-25-2006

          Reference:? Apache DOC and <<Hibernate 開發(fā)指南>>???????????????

          posted on 2006-04-26 14:55 Jkallen 閱讀(6697) 評論(8)  編輯  收藏 所屬分類: JEE學(xué)習(xí)其它開源

          評論

          # re: VO(DTO)與PO(DAO)之間的轉(zhuǎn)換 2006-04-26 17:48 寒晴天
          我想問你你代碼的樣式怎么弄的啊.好看,真好看.  回復(fù)  更多評論
            

          # re: VO(DTO)與PO(DAO)之間的轉(zhuǎn)換 2006-04-26 17:48 寒晴天
          說話,說話.  回復(fù)  更多評論
            

          # re: VO(DTO)與PO(DAO)之間的轉(zhuǎn)換 2006-04-26 17:50 寒晴天
          看的不是太明白哦  回復(fù)  更多評論
            

          # re: VO(DTO)與PO(DAO)之間的轉(zhuǎn)換 2006-04-27 08:51 藍(lán)天
          我倒!
          這個(gè)兄弟怎么不抓住重點(diǎn)呢?
            回復(fù)  更多評論
            

          # re: VO(DTO)與PO(DAO)之間的轉(zhuǎn)換 2006-04-27 08:54 藍(lán)天
          編輯的時(shí)候注意下,也有的.  回復(fù)  更多評論
            

          # re: VO(DTO)與PO(DAO)之間的轉(zhuǎn)換 2006-04-29 12:53 dennis
          試試dozer吧,更為強(qiáng)大  回復(fù)  更多評論
            

          # re: VO(DTO)與PO(DAO)之間的轉(zhuǎn)換[未登錄] 2007-05-08 01:09 jerry
          首先謝謝你,我還想問你要點(diǎn)一對多的代碼可以嗎/
          yangjiehuan@163.com  回復(fù)  更多評論
            

          # re: VO(DTO)與PO(DAO)之間的轉(zhuǎn)換 2007-05-10 19:24 藍(lán)天
          一年前用DTO,DAO來配合JSP顯示數(shù)據(jù),
          現(xiàn)在看來,這是不可取的: 增加了很多的代碼量 & 增加了系統(tǒng)中的文件 & 日后維護(hù)麻煩(地方太多,顯得過于雜亂)

          solve: 在spring中通過bind可以捆定相關(guān)的對象. 結(jié)合hibernate 可以很好解決以上遇到的問題

            回復(fù)  更多評論
            

          主站蜘蛛池模板: 昌江| 华安县| 分宜县| 涡阳县| 昌江| 永吉县| 水城县| 门头沟区| 运城市| 徐州市| 武清区| 油尖旺区| 遂宁市| 藁城市| 佛冈县| 延吉市| 绥化市| 华宁县| 茌平县| 延庆县| 佛冈县| 精河县| 高州市| 东光县| 五华县| 鸡泽县| 友谊县| 金乡县| 汉中市| 青田县| 丹巴县| 秦安县| 新沂市| 富裕县| 盐山县| 盈江县| 济宁市| 乌审旗| 枣强县| 临潭县| 江口县|