求解:同一个jpa查询出来的对像会是同一个吗?

问题描述

项目中有某个方法,该方法通过jpa查询出数据库表的某条记录。修改该条记录的某个值后(没有保存),再次调用jpa查询出数据库的该条记录,发现该记录的值是修改后的值,而不是数据库里的旧值?求解出现该现像的原理?是因为两个对像是同一个内存地址指针吗?

问题出现的环境背景及自己尝试过哪些方法

jdk 8.0
对比过两个像的hashcode的值是一样的

相关代码

粘贴代码文本(请勿用截图)

--wmsLastTimeService.java
public WmsLastTime getLastTime(int syncType) {
    return wmsLastTimeDao.findFirstBySyncTypeOrderByLastTime(syncType);
}

--调用方法

    WmsLastTime wmsLastTime = wmsLastTimeService.getLastTime(0);
    wmsLastTime.setOrderNo("1111");

    WmsLastTime wmsLastTime1 = wmsLastTimeService.getLastTime(0);
    wmsLastTime1.setOrderNo("2222");

你期待的结果是什么?实际看到的错误信息又是什么?

期望的结果,wmsLastTime的OrderNo是1111,wmsLastTime1的OrderNo是2222,但实际上wmsLastTime和wmsLastTime1的OrderNo都是2222

阅读 2.1k
2 个回答

jpa不清楚有没有一级缓存的概念,但是类比mybatis的一级缓存,和你这样的结果是一样的,前提条件:一级缓存生效
第一次查询将数据结果存到cache中,即wmsLastTime存到cache中 ,第二次查询你只是wmsLastTime1指向了wmsLastTime,此时两个都是同一个对象,一改就全改了

最后解决办法是:在wmsLastTimeService中注入EntityManager来清除一级缓存 ,可确保wmsLastTime和wmsLastTime1获取到的是不同的对像

参考链接:https://blog.jonslow.com/canc...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题