如下代码:
PubPsndoc pubdoc = pubPsndocDAOService.selectByPrimaryKey(in.id);pubdoc.setPkCorp(newpkcorp);pubdoc.setPkDept(newpkdept);pubPsndocDAOService.update(pubdoc);
PubPsndoc personPubdoc = pubPsndocDAOService.selectByPrimaryKey(in.id);
在上述代码中会产生一个问题,就是在第二次sql查询时,查出来的得到的personPubdoc中的值是和修改后的pubdoc是相同的,和数据库中的数据不同。
之所以产生这个问题是因为mybatis的一级缓存将的查询结果放置在缓存之中,当对查询值进行更改时,相当于修改了缓存当中的值。在第二次查询时,是查询条件也是相同的同一条sql。mybaits便默认从缓存中将值取出,而并未去执行sql语句去数据库中查询。这就导致了personPubdoc中的pkcorp值为newpkcorp、pkdept的值为newpkdept。
要想规避这个问题我们有两种方法:
第一种:我们在sql的查询条件中增加一个时间戳的条件,时间戳精确到毫秒可以保证每一条sql的查询条件都不是相同的。这样mybatis便不会从缓存中直接取值。
第二种:我们可以不对第一次查询到的值做直接修改。
PubPsndoc pubdoc = pubPsndocDAOService.selectByPrimaryKey(in.id);try{CommonUtil.bean2bean(pubdoc, pubdocChange); }catch(Exception e){.... }
PubPsndoc pubdocChange;
pubdocChange.setPkCorp(newpkcorp);pubdocChange.setPkDept(newpkdept);pubPsndocDAOService.update(pubdocChange);PubPsndoc personPubdoc = pubPsndocDAOService.selectByPrimaryKey(in.id);
我们一定要用CommonUtil.bean2bean()这个方法来进行反射获取属性值得到一个新的类,若是直接等于,类的地址未变还是会修改缓存中的值。