首页 > 学院 > 开发设计 > 正文

记一次数据库查询引发的诡异问题

2019-11-08 00:47:07
字体:
来源:转载
供稿:网友
数据库的SystemUser表添加了一个新的字段countLimit,然后把这个实体对应的DAO进行了整改。搞定之后发现,每次执行 selectAllUser() 这个方法时所有用户的这个字段的值都会变成0,无论怎么测试,结果都是一样的。第一个怀疑的是这个字段是不是被加了什么限制,于是查了一下,没有发现任何不对的地方。把字段删除重新添加,也是一样。把 selectAllUser() 执行的SQL语句放到数据库里执行却没有这个问题。思来想去,把能想到的奇奇怪怪的方法都试了都没有用。于是细心地跟了一下 selectAllUser() 这个方法的代码,发现在从数据库获取到结果集后还没有问题,但是把获取到的数据转换为List的时候这个 countLimit 字段就会被更新为0。继续一步步跟踪代码,dbutils 在将结果集转化为实体的时候是使用了 Bean 里面的 setter 方法给实体赋值的,继续跟踪发现,每次总是在给 countLimit 前面一个字段 level 赋值的时候出现 countLimit 在数据库中被设置为0的情况。于是找到SystemUser类的setLevel方法      public void setLevel(int level) {          this.level = level;          updateUser(this);     }原来是每次用户设置都会去把这个改变update到数据库中,而 dbutils 在转化结果集为实体的时候调用了这个方法,这个时候新创建的 countLimit 还没有被赋值,所以这个值会被设置为0。心得,不要在getter/setter方法内写业务逻辑。出现很诡异的问题的时候,一步步跟踪代码是很有效的办法。2017.2.21
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表