报错:dao 只允许调用查询方法

image.png

评论区

童年

2018-07-14 14:18

大神,为什么一个简单update方法都会报这样子的错误的呢?

童年

2018-07-14 14:22

杜福忠

2018-07-14 14:39

@童年 仔细阅读文档: http://www.jfinal.com/doc/5-3

dao对象是全局共享的,只能用于数据库查询,不能用于数据承载对象。数据承载需要使用new User().set(…)来实现。

童年

2018-07-14 14:42

@杜福忠 好的,谢谢

童年

2018-07-14 18:09

@杜福忠 我看了那个文档,还是没太懂,如果我不用对象的update,save方法,那我怎么保存,修改呢?数据承载需要使用new User().set(…)来实现.......这意思不也是找到那个对象,然后给set某个属性值吗?然后再update,原谅我是小白。

童年

2018-07-14 18:10

@杜福忠感觉jfinal有些东西的用法和Spring相关的框架的使用方式不一样,好郁闷

杜福忠

2018-07-14 20:04

@童年 你 UserService 里面是怎么写的了 ?
getTests 里面是什么业务?

dao对象是静态全局共享的, 如果被用来set(…)再get(...) , 在多线程请求下操作数据就会错乱的, 这个是JAVA最基础的概念, 以前总被新手误用, 所以对 dao对象 new User().dao() 做了判断提醒.

new 出来的对象, 就不一样了, 不会被多个线程操作了, 自然不会出错了

童年

2018-07-14 20:55

@杜福忠 service层没有业务逻辑,只是查询回来数据,仅此而已!文档里面说:new User().set(…)来实现,可是我不是做保存操作,为什么要new一个对象呢?我应该是查询某个对象,然后再对他进行修改,而不是new一个对象,对他修改吧,而且我也试过了:user.set("address", tests.get(i).getName()).update(),也不行;前面那个user是通过for循环查到的一个对象,然后对他进行修改!有什么问题吗?查回来的user怎么算是全局共享的dao呢?我真的没太懂jfinal的操作逻辑

JFinal

2018-07-14 22:06

@童年 这个问题其实很简单,不要想得那么复杂
1:异常出现在 UserController 第 21 行的 user.setAdress(...)
2:第 21 行的 user 曾经调用过 dao() 方法
3:往前追,user 来自于 users.get(i),再往前 users 来自于 UserService.getUsers()

这个问题就很明显了,你在 UserService.getUsers() 方法中调用过 user.dao() 方法,不要调用这些 user 的 dao() 方法即可

netwild

2018-07-16 11:17

如果之前用的是Hib的话,第一次接触jfinal确实会发懵
因为jfinal里的Model不仅是pojo,而且还实现了dao,合二为一
在生成Model时,会自动生成一个静态实例对象,这个对象就是用来dao的
但就像上面说的,这个对象只能用于查询,不能进行update
如果需要修改数据,可以利用这个对象进行各种检索来返回一个新的实例,针对这个实例进行update就没有问题了

童年

2018-07-26 11:06

@netwild 感谢大佬

童年

2018-07-29 14:38

@JFinal 感谢大佬

热门反馈

扫码入社