随笔-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啊?应该不会吧,我手工改动(将id指向javaBean的fileId)后,数据记录确删除不成功,会报:sql为空,不能执行之类的......

简单的解决办法,在DBTable增加多一个getJavaId()之类的方法,返回数据库表在javaBean的属性id(怎么实现,就看你自己喜欢咯,简单的一个办法就是给定一个命名策略,将数据库表主键,也就是id的所指向,转换为适当的javaBean属性咯)给BeanWrapper,这样就可以了。

是我说错了,还是使用方法不当?欢迎指正~~~~~~~~

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

posted on 2007-06-28 12:17 三告习习 阅读(1192) 评论(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啊,其他的还没有很多时间来得及研究  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问