近來使用EasyDBO發現一些問題。
首先,DBTable中的id命名意義不明朗,這個id你猜是數據庫表的key還是javaBean對應于數據庫表key的屬性?我的猜測是前者,數據庫表的key(主鍵的名稱)。
但是這樣就有問題了,如果你的數據庫表字段與javaBean一一對應的屬性命名一致的話,倒沒有什么問題,不一致的話,出現什么問題呢,看看下面的代碼:
執行后,拋出異常:
暈~~~~~~~主鍵產生錯誤!!但是奇怪的是,你期待的結果(刪除一個對象,即數據庫表的一條記錄)卻依然成功!記錄被刪除了!!
“主鍵產生錯誤”究竟是怎么產生的呢?
看看錯誤的信息就可以跟蹤,發現是原因是這樣的:
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方法:
BeanWrapper要獲取屬性值的屬性是怎么來的呢?table.getId(),也就是DBTable的id。
一開始我在上面就提到了,DBTable的id是數據庫表的主鍵名,不是javaBean的屬性,那么如果你的數據庫表的主鍵名和javaBean對應的屬性命名不一致,你能在javaBean中找到數據庫表的主鍵名的屬性嗎?也就是說你在javaBean上只能找到fileId,但是卻不能找到FILE_ID,當然,你要去獲取FILE_ID的值,不出錯才怪!
或許,你會說,是不是DBTable的id指javaBean的屬性啊,也就是fileId啊?應該不會吧,我手工改動(將id指向javaBean的fileId)后,數據記錄確刪除不成功,會報:sql為空,不能執行之類的......
簡單的解決辦法,在DBTable增加多一個getJavaId()之類的方法,返回數據庫表在javaBean的屬性id(怎么實現,就看你自己喜歡咯,簡單的一個辦法就是給定一個命名策略,將數據庫表主鍵,也就是id的所指向,轉換為適當的javaBean屬性咯)給BeanWrapper,這樣就可以了。
是我說錯了,還是使用方法不當?歡迎指正~~~~~~~~
EasyDBO (http://www.easyjf.com/ 可以下載)。