近来使用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/ 可以下载)。