隨筆-35  評論-97  文章-0  trackbacks-0

          近來使用EasyDBO發現一些問題。

          首先,DBTable中的id命名意義不明朗,這個id你猜是數據庫表的key還是javaBean對應于數據庫表key的屬性?我的猜測是前者,數據庫表的key(主鍵的名稱)。

          但是這樣就有問題了,如果你的數據庫表字段與javaBean一一對應的屬性命名一致的話,倒沒有什么問題,不一致的話,出現什么問題呢,看看下面的代碼:

                  //使用annotation注釋方式來進行實現數據庫表與javaBean的對應
                  EasyJDB db=EasyJDB.getInstance();    
                  
          //數據庫表為“AFTER_ALARM_FILE_RESULT”
                  AfterAlarmFileResult a = new AfterAlarmFileResult();
                  
          //fileId是我數據庫表主鍵“FILE_ID”對應的javaBean屬性
                  a.setFileId(222);
                  db.del(a);
                  db.close();

          執行后,拋出異常:

          0    [main] ERROR com.easyjf.dbo.EasyJDB  - 主鍵產生錯誤!com.easyjf.beans.exception.NotReadablePropertyException: Invalid property 'FILE_ID' of bean class [com.surfilter.gacomm.center.entity.AfterAlarmFileResult]: Bean property 'FILE_ID' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
          com.easyjf.beans.exception.NotReadablePropertyException: Invalid property 
          'FILE_ID' of bean class [com.surfilter.gacomm.center.entity.AfterAlarmFileResult]: Bean property 'FILE_ID' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
           at com.easyjf.beans.BeanWrapper.getPropertyValue(BeanWrapper.java:
          470)
           at com.easyjf.beans.BeanWrapper.getPropertyValue(BeanWrapper.java:
          462)
           at com.easyjf.dbo.EasyJDB.generatorID(EasyJDB.java:
          538)
           at com.easyjf.dbo.EasyJDB.obj2dboMap(EasyJDB.java:
          604)
           at com.easyjf.dbo.EasyJDB.obj2dbo(EasyJDB.java:
          588)
           at com.easyjf.dbo.EasyJDB.del(EasyJDB.java:
          399)
           at test.EntityInheritAnotationTest.deleteAData(EntityInheritAnotationTest.java:
          52)
           at test.EntityInheritAnotationTest.main(EntityInheritAnotationTest.java:
          33)

          暈~~~~~~~主鍵產生錯誤!!但是奇怪的是,你期待的結果(刪除一個對象,即數據庫表的一條記錄)卻依然成功!記錄被刪除了!!

          “主鍵產生錯誤”究竟是怎么產生的呢?

          看看錯誤的信息就可以跟蹤,發現是原因是這樣的:

          at com.easyjf.beans.BeanWrapper.getPropertyValue(BeanWrapper.java:462)   --標號5
           at com.easyjf.dbo.EasyJDB.generatorID(EasyJDB.java:538)  --標號4
           at com.easyjf.dbo.EasyJDB.obj2dboMap(EasyJDB.java:604)  --標號3
           at com.easyjf.dbo.EasyJDB.obj2dbo(EasyJDB.java:588) --標號2
           at com.easyjf.dbo.EasyJDB.del(EasyJDB.java:399) -- 標號1

          留意我上面的“標號n”,那時堆棧執行的過程。

          標號1   --> 執行刪除對象

          標號2   --> 執行將對象轉換為EasyDBO中的定義的DBObject對象,

          標號3   --> 執行將對象轉換為Map對象(屬性存儲到map中)

          標號4  --> 執行生成主鍵值

          標號5  --> 通過BeanWrapper來獲取屬性值。問題來了,“FILE_ID”屬性找不到!

          看看這里的代碼:

          EasyJDB的generatorID方法:

              private void generatorID(Object obj, DBTable table) {
                  
          /**
                   * 若obj已經有主鍵值則直接返回
                   
          */

                  
          if ((table.getIdGenerator() == null)
                          
          || "".equals(table.getIdGenerator())) {
                      
          return;
                  }

                  
          try {
                      BeanWrapper wrapper 
          = new BeanWrapper(obj);
                      Object tmpId 
          = wrapper.getPropertyValue(table.getId());
                      Class keyType
          =wrapper.getPropertyType(table.getId());

          BeanWrapper要獲取屬性值的屬性是怎么來的呢?table.getId(),也就是DBTable的id。

          一開始我在上面就提到了,DBTable的id是數據庫表的主鍵名,不是javaBean的屬性,那么如果你的數據庫表的主鍵名和javaBean對應的屬性命名不一致,你能在javaBean中找到數據庫表的主鍵名的屬性嗎?也就是說你在javaBean上只能找到fileId,但是卻不能找到FILE_ID,當然,你要去獲取FILE_ID的值,不出錯才怪!

          或許,你會說,是不是DBTable的id指javaBean的屬性啊,也就是fileId?。繎摬粫桑沂止じ膭樱▽d指向javaBean的fileId)后,數據記錄確刪除不成功,會報:sql為空,不能執行之類的......

          簡單的解決辦法,在DBTable增加多一個getJavaId()之類的方法,返回數據庫表在javaBean的屬性id(怎么實現,就看你自己喜歡咯,簡單的一個辦法就是給定一個命名策略,將數據庫表主鍵,也就是id的所指向,轉換為適當的javaBean屬性咯)給BeanWrapper,這樣就可以了。

          是我說錯了,還是使用方法不當?歡迎指正~~~~~~~~

          EasyDBO (http://www.easyjf.com/ 可以下載)。

          posted on 2007-06-28 12:17 三告習習 閱讀(1203) 評論(2)  編輯  收藏 所屬分類: easyJF-projects

          評論:
          # re: [EasyDBO] 是bug還是我用法不當? EasyDBO 該完善一些的時候了吧~~[未登錄] 2007-07-16 21:12 | 天意
          看了您的文章,倍感慚愧同時更大的是收獲,只能說我們會努力做好的,同時誠摯的邀請您,希望您能加入到我們的開發中來!  回復  更多評論
            
          # re: [EasyDBO] 是bug還是我用法不當? EasyDBO 該完善一些的時候了吧~~ 2007-07-16 21:31 | 三告習習
          @天意
          誰都有忙的時候嘛,呵呵。不過我覺得,雖然easy團隊涉及項目很多,但是,不管哪一個項目,都應該盡力做到最好,而不是顧此失彼。如果easy的哪怕只做一個項目,做得有聲有色了,都是很受人歡迎的。我想,springside做得很不錯
          其實也希望能為開源貢獻一些
          但是目前對easyJF了解多一點的項目只是easyDBO啊,其他的還沒有很多時間來得及研究  回復  更多評論
            
          主站蜘蛛池模板: 黄浦区| 鄄城县| 呼和浩特市| 丹江口市| 疏附县| 房山区| 台南县| 洛隆县| 黄平县| 平度市| 北票市| 阿拉尔市| 息烽县| 崇明县| 廊坊市| 三都| 繁昌县| 布尔津县| 莱芜市| 彩票| 大洼县| 丹江口市| 沙坪坝区| 齐齐哈尔市| 三穗县| 威信县| 寻甸| 北京市| 达拉特旗| 宜丰县| 扶绥县| 河池市| 盐源县| 临泽县| 塔城市| 晋宁县| 阳谷县| 高安市| 体育| 五指山市| 遂昌县|