通过_getConfig()修改数据源的表名问题

在JfinalConfig里定义了两套数据源(分别定义的druidPlugin1,arp1 ;druidPlugin2,arp2 ;

两套数据源有一张结构相同的表,但是表名不一样。

arp1.addMapping("config", "id", Config.class);
arp2.addMapping("sys_config", "id", Config.class);

我通过更改Config的_getConfig()返回值切换的数据源,但是访问的表并没有切换,一直为我最后配置的arp2配置的表名sys_config,请问是同一个model不能配置不同的表名吗?

后期发现Model的save方法,取表明这里并没有根据数据源而切换

Config config = _getConfig();
  Table table = getTable();
后期getTable()方法能否设计成跟_getConfig()一样吗?

评论区

JFinal

2018-03-08 10:45

同一个 Model 是无法 “分别” 或者叫 “同时” 映射给两个不同数据源的,因为这样做没有意义,而且会出问题

因为 Model 中所有 api 去找数据源的时候,都是通过 getClass() 拿到自己是什么 class,然后将这个 class 当成 key 去 Map 中找数据源,而 Model.class 是全局唯一的,必然也只能对应一个数据源

如果希望 model 切换数据源,只能是临时来切换,像这样:
model.use(config).find(...);

上面说了这么多,其实你只要问你自己下面一个问题就可以了:
假定有下面的配置:
arp1.addMapping("config", "id", Config.class);
arp2.addMapping("sys_config", "id", Config.class);

那么 new Config().findById(123); 这行代码到底是去 "config" 还是去 "sys_config" 数据源去查询? 所以我前面说的同一个 Model 映射到多个数据源没有意义

马小酱

2018-03-08 13:10

arp1.addMapping("config", "id", Config.class);
ActiveRecordPlugin mysqlArp = new ActiveRecordPlugin("arp1",mySqlDruidPlugin);
设置表映射的时候是添加到arp中的,而new arp的时候指定了数据源,我觉得切换数据源以后对应的model 和table的关系也应该切换啊

热门反馈

扫码入社