4.5升4.7 多数源连接启动JFinal时异常

一、首先4.5版本下启动多数源连接正常,如下图QQ图片20191105102235.png

二、其次4.7版本下启动单个数据源连接正常,如下图:QQ图片20191105102401.png

三、然后,在4.6或4.7版本下,启动多个数据源连接异常了(以4.7为例说明),如下图:QQ图片20191105102610.png

波总,有时间帮看看,谢谢,暂时降到4.5版本下使用正常

评论区

JFinal

2019-11-07 16:59

注意看 jfinal 4.7 的 TableMapping.java 代码的第 38 行:
https://gitee.com/jfinal/jfinal/blob/jfinal-4.7/src/main/java/com/jfinal/plugin/activerecord/TableMapping.java

第 38 行的 if 判断在 4.5 版本之中的确是没有的:
https://gitee.com/jfinal/jfinal/blob/jfinal-4.5/src/main/java/com/jfinal/plugin/activerecord/TableMapping.java

这个判断其实是为了让你的代码更加稳固而添加的,因为 Model 只能被映射一次,而你自己的项目中将 BasBrand 映射了多次,这个在 jfinal 4.5 中虽然没有提示错误,但仅仅是最后一次映射有效

检查一下各个数据源的 mapping 代码,去掉那个重复的 BasBrand 映射即可,只保留一个

binke

2019-11-08 09:03

嗯 感谢波总 我只用了一个_MappingKit做映射,但是arp是不同的,4.5版本我看能过就没管它,使用也是正常的 ,4.7版本第38行做的约束就过不了,那我只需要每一个arp对应一个不同的_MappingKit就好了 对吧

binke

2019-11-08 11:17

波总 我专测试了一下,还是不行,不同的数据源,不同的ActiveRecordPlugin, 没有用_MappingKit 而是直接做的映射,还是报一样的错误,测试代码如下:
public void configPlugin(Plugins me) {
// test1数据源
HikariCpPlugin dsTest1 = createHikariCpPlugin(jdbcUrl1);
dsTest1.setDriverClass("oracle.jdbc.OracleDriver");
me.add(dsTest1);

// test1 ActiveRecrodPlugin 实例,并指定configName为 test1
ActiveRecordPlugin ArpTest1 = new ActiveRecordPlugin("test1",dsTest1);
ArpTest1.setTransactionLevel(2);
me.add(ArpTest1);
ArpTest1.setDialect(new OracleDialect());
ArpTest1.addMapping("BAS_BRAND", "BRAND_CODE", BasBrand.class);

// test2数据源
HikariCpPlugin dsTest2 = createHikariCpPlugin(jdbcUrl2);
dsTest2.setDriverClass("oracle.jdbc.OracleDriver");
me.add(dsTest2);

// test2 ActiveRecrodPlugin 实例,并指定configName为 test2
ActiveRecordPlugin ArpTest2 = new ActiveRecordPlugin("test2",dsTest2);
ArpTest2.setTransactionLevel(2);
me.add(ArpTest2);
ArpTest2.setDialect(new OracleDialect());
ArpTest2.addMapping("BAS_BRAND", "BRAND_CODE", BasBrand.class);
}

执行结果:
Starting JFinal 4.7 -> http://0.0.0.0:9090
Info: jfinal-undertow 1.9, undertow 2.0.25.Final, jvm 1.8.0_181
Can not create Table object, maybe the table BAS_BRAND is not exists.

2019-11-08 11:06:42
[ERROR]-[Thread: main]-[com.jfinal.core.Config.startPlugins()]: Plugin start error: com.jfinal.plugin.activerecord.ActiveRecordPlugin.
java.lang.RuntimeException: Model mapping already exists : com.wms.common.model.BasBrand

JFinal

2019-11-08 13:49

注意对比 ArpTest1 与 ArpTest2 的 addMapping(...)
ArpTest1.addMapping("BAS_BRAND", "BRAND_CODE", BasBrand.class);
ArpTest2.addMapping("BAS_BRAND", "BRAND_CODE", BasBrand.class);

这两个 addMapping 映射了同一个 BasBrand.class,所以就会有这个异常

Model 在一个应用中是全局唯一的,多数据源的时候也只能映射一次,以前老版本虽然没做限制,但最终只有最后一次映射有效,前一次映射会被覆盖

热门反馈

扫码入社