隨筆-35  評(píng)論-97  文章-0  trackbacks-0

          近來(lái)使用EasyDBO發(fā)現(xiàn)一些問(wèn)題。

          首先,DBTable中的id命名意義不明朗,這個(gè)id你猜是數(shù)據(jù)庫(kù)表的key還是javaBean對(duì)應(yīng)于數(shù)據(jù)庫(kù)表key的屬性?我的猜測(cè)是前者,數(shù)據(jù)庫(kù)表的key(主鍵的名稱(chēng))。

          但是這樣就有問(wèn)題了,如果你的數(shù)據(jù)庫(kù)表字段與javaBean一一對(duì)應(yīng)的屬性命名一致的話(huà),倒沒(méi)有什么問(wèn)題,不一致的話(huà),出現(xiàn)什么問(wèn)題呢,看看下面的代碼:

                  //使用annotation注釋方式來(lái)進(jìn)行實(shí)現(xiàn)數(shù)據(jù)庫(kù)表與javaBean的對(duì)應(yīng)
                  EasyJDB db=EasyJDB.getInstance();    
                  
          //數(shù)據(jù)庫(kù)表為“AFTER_ALARM_FILE_RESULT”
                  AfterAlarmFileResult a = new AfterAlarmFileResult();
                  
          //fileId是我數(shù)據(jù)庫(kù)表主鍵“FILE_ID”對(duì)應(yīng)的javaBean屬性
                  a.setFileId(222);
                  db.del(a);
                  db.close();

          執(zhí)行后,拋出異常:

          0    [main] ERROR com.easyjf.dbo.EasyJDB  - 主鍵產(chǎn)生錯(cuò)誤!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)

          暈~~~~~~~主鍵產(chǎn)生錯(cuò)誤!!但是奇怪的是,你期待的結(jié)果(刪除一個(gè)對(duì)象,即數(shù)據(jù)庫(kù)表的一條記錄)卻依然成功!記錄被刪除了!!

          “主鍵產(chǎn)生錯(cuò)誤”究竟是怎么產(chǎn)生的呢?

          看看錯(cuò)誤的信息就可以跟蹤,發(fā)現(xiàn)是原因是這樣的:

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

          留意我上面的“標(biāo)號(hào)n”,那時(shí)堆棧執(zhí)行的過(guò)程。

          標(biāo)號(hào)1   --> 執(zhí)行刪除對(duì)象

          標(biāo)號(hào)2   --> 執(zhí)行將對(duì)象轉(zhuǎn)換為EasyDBO中的定義的DBObject對(duì)象,

          標(biāo)號(hào)3   --> 執(zhí)行將對(duì)象轉(zhuǎn)換為Map對(duì)象(屬性存儲(chǔ)到map中)

          標(biāo)號(hào)4  --> 執(zhí)行生成主鍵值

          標(biāo)號(hào)5  --> 通過(guò)BeanWrapper來(lái)獲取屬性值。問(wèn)題來(lái)了,“FILE_ID”屬性找不到!

          看看這里的代碼:

          EasyJDB的generatorID方法:

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

                  
          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要獲取屬性值的屬性是怎么來(lái)的呢?table.getId(),也就是DBTable的id。

          一開(kāi)始我在上面就提到了,DBTable的id是數(shù)據(jù)庫(kù)表的主鍵名,不是javaBean的屬性,那么如果你的數(shù)據(jù)庫(kù)表的主鍵名和javaBean對(duì)應(yīng)的屬性命名不一致,你能在javaBean中找到數(shù)據(jù)庫(kù)表的主鍵名的屬性嗎?也就是說(shuō)你在javaBean上只能找到fileId,但是卻不能找到FILE_ID,當(dāng)然,你要去獲取FILE_ID的值,不出錯(cuò)才怪!

          或許,你會(huì)說(shuō),是不是DBTable的id指javaBean的屬性啊,也就是fileId啊?應(yīng)該不會(huì)吧,我手工改動(dòng)(將id指向javaBean的fileId)后,數(shù)據(jù)記錄確刪除不成功,會(huì)報(bào):sql為空,不能執(zhí)行之類(lèi)的......

          簡(jiǎn)單的解決辦法,在DBTable增加多一個(gè)getJavaId()之類(lèi)的方法,返回?cái)?shù)據(jù)庫(kù)表在javaBean的屬性id(怎么實(shí)現(xiàn),就看你自己喜歡咯,簡(jiǎn)單的一個(gè)辦法就是給定一個(gè)命名策略,將數(shù)據(jù)庫(kù)表主鍵,也就是id的所指向,轉(zhuǎn)換為適當(dāng)?shù)膉avaBean屬性咯)給BeanWrapper,這樣就可以了。

          是我說(shuō)錯(cuò)了,還是使用方法不當(dāng)?歡迎指正~~~~~~~~

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

          posted on 2007-06-28 12:17 三告習(xí)習(xí) 閱讀(1207) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): easyJF-projects

          評(píng)論:
          # re: [EasyDBO] 是bug還是我用法不當(dāng)? EasyDBO 該完善一些的時(shí)候了吧~~[未登錄](méi) 2007-07-16 21:12 | 天意
          看了您的文章,倍感慚愧同時(shí)更大的是收獲,只能說(shuō)我們會(huì)努力做好的,同時(shí)誠(chéng)摯的邀請(qǐng)您,希望您能加入到我們的開(kāi)發(fā)中來(lái)!  回復(fù)  更多評(píng)論
            
          # re: [EasyDBO] 是bug還是我用法不當(dāng)? EasyDBO 該完善一些的時(shí)候了吧~~ 2007-07-16 21:31 | 三告習(xí)習(xí)
          @天意
          誰(shuí)都有忙的時(shí)候嘛,呵呵。不過(guò)我覺(jué)得,雖然easy團(tuán)隊(duì)涉及項(xiàng)目很多,但是,不管哪一個(gè)項(xiàng)目,都應(yīng)該盡力做到最好,而不是顧此失彼。如果easy的哪怕只做一個(gè)項(xiàng)目,做得有聲有色了,都是很受人歡迎的。我想,springside做得很不錯(cuò)
          其實(shí)也希望能為開(kāi)源貢獻(xiàn)一些
          但是目前對(duì)easyJF了解多一點(diǎn)的項(xiàng)目只是easyDBO啊,其他的還沒(méi)有很多時(shí)間來(lái)得及研究  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 当雄县| 安平县| 新郑市| 城固县| 襄城县| 邢台市| 兴化市| 绵竹市| 文山县| 松桃| 高清| 阿图什市| 涿鹿县| 睢宁县| 泰兴市| 临颍县| 白山市| 津南区| 新营市| 万宁市| 绥棱县| 西乌珠穆沁旗| 化州市| 孙吴县| 永仁县| 金华市| 汉阴县| 曲松县| 湖口县| 甘孜县| 兴安盟| 沈丘县| 平罗县| 泰州市| 乳山市| 历史| 中超| 乌海市| 高青县| 鄱阳县| 公安县|