mybatis一级缓存导致sql查询出现问题

如下代码:

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()这个方法来进行反射获取属性值得到一个新的类,若是直接等于,类的地址未变还是会修改缓存中的值。

猜你喜欢

转载自www.cnblogs.com/Concerning/p/10298565.html