随笔-35  评论-97  文章-0  trackbacks-0

在某些情况下,我们可能需要同一个实体bean对应着多个数据库表,比如,你的数据库表是按照每个月添加一个,但是对应的实体bean并没有改变。这个时候,我们就需要支持表明变换了,否则,难道你每个月改变一下orm映射配置吗?如果每天都换一个表呢?

在EasyDBO上,要做到支持表名变换是很容易的。只需在使用各种数据库操作时添加一个表名称的的变量(按照一定的算法产生),如原来的easyDB.add(object)变为easyDB.add(object, tablename)。

在具体的实现上,我们应该从哪里入手去替换表名呢?看看EasyDBO的源码,保存有数据库表名称的是在DBTable这个类中,其中name就是指数据库表名,利用setter方法,很容易植入数据库表名。但是在哪个时机植入比较合适?当然选取尽可能可以减少重复代码就可以完成的时机。

看看吧,在信息转换为DBTable对象时,再重新植入表名,就可以了。在EasyDB类中,方法private DBTable findTable(Class cls)会从类或对象中获取信息包装成DBTable对象,所以这是关键的地方。private DBObject obj2dbo(Object obj)和其他的方法都直接或者间接调findTable(Class cls)来获取表信息。做一些小改动就可以了,最好是添加一个重载的方法,而不是修改原来的方法。修改添加两个样板,其他方法也差不多是这样:

    private DBTable findTable(Class cls, String tableName)
    
{
        
if(!StringUtils.hasText(tableName)){
            
return findTable(cls);
        }

        DBTable table 
= this.mapping.findTable(cls);
        table.setName(tableName);
        
return table;
    }


    
private DBObject obj2dbo(Object obj, String tableName)
    
{
        
if(!StringUtils.hasText(tableName)){
            
return obj2dbo(obj);
        }

        
/**
         * 若obj本来就是泛数据表DBOjbect对象,则直接返回
         
*/

        
if(obj.getClass() == DBObject.class)
        
{
            
return (DBObject)obj;
        }

        DBTable table 
= findTable(obj.getClass(),tableName);
        DBObject dbo 
= new DBObject(table);
        dbo.setValue(obj2dboMap(obj, table));
        dbo.setIdValue(dbo.get(table.getId()));
        
return dbo;
    }

给出修改后的EasyDB类的源码,在这里下载。

 

posted on 2007-07-06 10:42 三告习习 阅读(953) 评论(2)  编辑  收藏 所属分类: easyJF-projects

评论:
# re: [EasyDBO] EasyDBO添加支持数据库表名(表结构不变)变换功能 2007-07-16 20:53 | 小雨
这个方法还真好用,以前没这样用过。  回复  更多评论
  
# re: [EasyDBO] EasyDBO添加支持数据库表名(表结构不变)变换功能 2007-07-16 21:09 | 三告习习
@小雨
呵呵,过奖咯
因为需要,凑用一下而已

  回复  更多评论
  

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


网站导航: