首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
报错:dao 只允许调用查询方法
童年
2018-07-14 14:17
项目:
JFinal
评论区
童年
2018-07-14 14:18
大神,为什么一个简单update方法都会报这样子的错误的呢?
回复
童年
2018-07-14 14:22
@JFinal
回复
杜福忠
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
感谢大佬
回复
发送
我要反馈
热门反馈
扫码入社