最近有个地方更新字段明明debug看到执行了更新了,但是之后查询数据库表却没有值。仔细排查发现了问题,伪代码如下
XXXVOImpl vo = service.findByPrimaryKey(id); ...又调用了一个方法,里面执行如下 XXXVOImpl vo2 = service.findByPrimaryKey(id); vo2.setA(xxx); service.update(vo2); .... vo.setB(xxx); service.update(vo);
在方法A里面查询到了一个vo对象,然后方法A内部又调用了一个方法B,在方法B里面也通过id查询到了vo2,然后对vo2的字段A进行了更新。
内部方法B执行完毕后,回到外部方法A接着执行,又继续更新之前(执行方法B以前)的vo,由于vo2有更新,所以这个vo此时不是最新的vo,vo里面属性A是没有更新的,此时再次更新vo,就把vo2里面更新的字段值弄丢了。
解决方案:
1、将vo作为参数传入内部方法B,替换vo2 ,如此,里面vo set值,外面vo也会有。
2、外面更新之前再查询一次vo,以保证vo是最新的。