使用sqlite的find方法查询转换Model抛出Runtime异常!

private String drver="org.sqlite.JDBC";
	private String sqlite="aaa";
	
	public void load(String path) {
		DruidDataSource druid=new DruidDataSource();
		druid.setDriverClassName(drver);
		druid.setUrl("jdbc:sqlite:"+path);
	    ActiveRecordPlugin arp = new ActiveRecordPlugin(sqlite,druid);
	    arp.addMapping("t_test", "id", TestConfig.class);
	
	    arp.start();
	}

独立配置持久层的代码,然后调用如下代码

	Db.use(sqlite).findFirst("select 1");  //这个没事
List<TestConfig> ab=TestConfig.dao.use(sqlite).findAll(); //这个报错

java.lang.RuntimeException: dao 只允许调用查询方法

at com.jfinal.plugin.activerecord.Model.use(Model.java:205)


如何解决,按照官方文档所说的,我已经设置了addMapping,还缺什么?

评论区

JFinal

2020-11-03 10:49

在 arp.start() 之前,先要 druid.start()

JFinal

2020-11-03 10:49

此外, arp.addMapping(...) 这类代码不需要手写,全交给生成器自动生成

首页右侧下载 jfinal_demo_for_maven.zip,里面有生成器,拿过来改改三个参数即可使用

chilun555

2020-11-03 11:01

@JFinal 我使用的是DruidDataSource,它没有start方法

JFinal

2020-11-03 11:04

DruidDataSource 换成 DruidPlugin 试试

chilun555

2020-11-03 11:12

@JFinal 同样的异常还是出现
public void load(String path) {
DruidPlugin dp = new DruidPlugin("jdbc:sqlite:"+path, null, null);
dp.setDriverClass(drver);
ActiveRecordPlugin arp = new ActiveRecordPlugin(sqlite,dp);
arp.addMapping("t_test", "id", TestConfig.class);
dp.start();
arp.start();
}

JFinal

2020-11-03 11:45

异常信息:java.lang.RuntimeException: dao 只允许调用查询方法

dao = new TestConfig().dao();
上面的 dao 对象只能调用查询方法,不能调用 use(...) 方法,因为这个 dao 是全局共享的,如果允许 use(...) 的话,多线程环境下,会造成混乱

TestConfig.dao.use(sqlite).findAll() 改成:
new TestConfig().use(sqlite).findAll();

也就是说 Model 的 use , 临时 new 出来使用。 因为对于 Model 来说,切换数据源本来就是自动的, 绝大部分情况下无需 use(...) 来切换

use(...) 方法在 Db.use(...) 中用得多,因为 Db + Record 无法自动切换数据源, 需要主动调用 Db.use(...) 来切换

JFinal

2020-11-03 11:47

补充一下,Model 自动切换数据源的原理:
1:arp = new ActiveRecordPlugin(sqlite,druid) 建立了 arp 到 druid 数据源的关联

2:arp.add(..., modelClass) 建立了 arp 到 model 的关联

3:在 model.find(...) 的时候先是能找到 arp , 然后通过 arp 找到 druid 数据源

zzutligang

2020-11-03 14:55

我之前也咨询过这个问题,现在代码全部改成
new TestConfig().use(sqlite).findAll();
这种方式了。
因为我得系统特殊,一套程序可以给不同的客户使用,不同的客户,连接的业务数据库是不一样的,但数据库结构是一模一样的。这样的,就必须要使用
new TestConfig().use(sqlite).findAll();
这种方法了。

热门反馈

扫码入社