登录
首页 >  数据库 >  MySQL

使用JPA查询同一对象,修改值后再次查询为何会得到更新后的值?

时间:2024-11-03 21:39:46 352浏览 收藏

在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《使用JPA查询同一对象,修改值后再次查询为何会得到更新后的值?》,聊聊,希望可以帮助到正在努力赚钱的你。

使用JPA查询同一对象,修改值后再次查询为何会得到更新后的值?

jpa查询出的同一对象是否保持内存一致性

问题描述

在java中使用jpa查询出数据库的一条记录后,修改其值而不保存。再次调用jpa查询出同一记录时,发现该记录的值已更新为修改后的值,而非数据库中的旧值。

原因分析

上述现象源于java persistence api(jpa)的一级缓存机制。当执行第一次jpa查询时,查询结果会缓存在称为一级缓存的临时存储区域中。 subsequent查询可以直接从缓存中获取数据,而无需再访问数据库。在以下示例中,wmslasttime和wmslasttime1都指向同一缓存对象,因此修改其值将影响同一实体的不同引用。

相关代码

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,因为它们指向同一二级缓存对象。

本篇关于《使用JPA查询同一对象,修改值后再次查询为何会得到更新后的值?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于数据库的相关知识,请关注golang学习网公众号!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>