[EasyDBO] 是bug还是我用法不当? EasyDBO 该完善一些的时候了吧~~

[EasyDBO] 是bug还是我用法不当? EasyDBO 该完善一些的时候了吧~~

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



你可能感兴趣的:([EasyDBO] 是bug还是我用法不当? EasyDBO 该完善一些的时候了吧~~)