近來使用EasyDBO發(fā)現(xiàn)一些問題。
首先,DBTable中的id命名意義不明朗,這個id你猜是數(shù)據(jù)庫表的key還是javaBean對應(yīng)于數(shù)據(jù)庫表key的屬性?我的猜測是前者,數(shù)據(jù)庫表的key(主鍵的名稱)。
但是這樣就有問題了,如果你的數(shù)據(jù)庫表字段與javaBean一一對應(yīng)的屬性命名一致的話,倒沒有什么問題,不一致的話,出現(xiàn)什么問題呢,看看下面的代碼:
執(zhí)行后,拋出異常:
暈~~~~~~~主鍵產(chǎn)生錯誤!!但是奇怪的是,你期待的結(jié)果(刪除一個對象,即數(shù)據(jù)庫表的一條記錄)卻依然成功!記錄被刪除了!!
“主鍵產(chǎn)生錯誤”究竟是怎么產(chǎn)生的呢?
看看錯誤的信息就可以跟蹤,發(fā)現(xiàn)是原因是這樣的:
at com.easyjf.beans.BeanWrapper.getPropertyValue(BeanWrapper.java:462) --標(biāo)號5 at com.easyjf.dbo.EasyJDB.generatorID(EasyJDB.java:538) --標(biāo)號4 at com.easyjf.dbo.EasyJDB.obj2dboMap(EasyJDB.java:604) --標(biāo)號3 at com.easyjf.dbo.EasyJDB.obj2dbo(EasyJDB.java:588) --標(biāo)號2 at com.easyjf.dbo.EasyJDB.del(EasyJDB.java:399) -- 標(biāo)號1
留意我上面的“標(biāo)號n”,那時堆棧執(zhí)行的過程。
標(biāo)號1 --> 執(zhí)行刪除對象
標(biāo)號2 --> 執(zhí)行將對象轉(zhuǎn)換為EasyDBO中的定義的DBObject對象,
標(biāo)號3 --> 執(zhí)行將對象轉(zhuǎn)換為Map對象(屬性存儲到map中)
標(biāo)號4 --> 執(zhí)行生成主鍵值
標(biāo)號5 --> 通過BeanWrapper來獲取屬性值。問題來了,“FILE_ID”屬性找不到!
看看這里的代碼:
EasyJDB的generatorID方法:
BeanWrapper要獲取屬性值的屬性是怎么來的呢?table.getId(),也就是DBTable的id。
一開始我在上面就提到了,DBTable的id是數(shù)據(jù)庫表的主鍵名,不是javaBean的屬性,那么如果你的數(shù)據(jù)庫表的主鍵名和javaBean對應(yīng)的屬性命名不一致,你能在javaBean中找到數(shù)據(jù)庫表的主鍵名的屬性嗎?也就是說你在javaBean上只能找到fileId,但是卻不能找到FILE_ID,當(dāng)然,你要去獲取FILE_ID的值,不出錯才怪!
或許,你會說,是不是DBTable的id指javaBean的屬性啊,也就是fileId啊?應(yīng)該不會吧,我手工改動(將id指向javaBean的fileId)后,數(shù)據(jù)記錄確刪除不成功,會報:sql為空,不能執(zhí)行之類的......
簡單的解決辦法,在DBTable增加多一個getJavaId()之類的方法,返回數(shù)據(jù)庫表在javaBean的屬性id(怎么實現(xiàn),就看你自己喜歡咯,簡單的一個辦法就是給定一個命名策略,將數(shù)據(jù)庫表主鍵,也就是id的所指向,轉(zhuǎn)換為適當(dāng)?shù)膉avaBean屬性咯)給BeanWrapper,這樣就可以了。
是我說錯了,還是使用方法不當(dāng)?歡迎指正~~~~~~~~
EasyDBO (http://www.easyjf.com/ 可以下載)。