JPA查询同一个对象为何修改会相互影响?
jpa查询出来的同一个对象
问题描述:
在使用jpa进行数据库查询时,发现连续查询同一张表中的特定记录后,第一次修改记录的某个字段会立即影响第二次查询的结果,而非数据库中的原始值。
分析:
这种情况通常是由于jpa的缓存机制造成的。jpa中的一级缓存会将查询的结果对象缓存在内存中,以避免重复的数据库查询。因此,第二次查询时,jpa直接从一级缓存中获取对象,而不会再向数据库发送查询请求。
内存地址指针:
在java中,对象是通过引用进行访问的,这意味着对象在内存中具有唯一的地址。当创建多个指向同一对象的引用时,这些引用共享同一个内存地址,所以对其中一个引用的修改也会影响另一个引用。
在该案例中:
第一次查询wmslasttime时,它被缓存到一级缓存中。当修改wmslasttime的orderno字段时,缓存中的对象也被修改了。第二次查询wmslasttime1时,它实际上指向的是缓存中的同一个对象,所以第二次查询的结果也反映了修改后的值。
避免缓存影响:
为了避免缓存影响,需要在修改对象后显式地刷新缓存,或者使用@modifying注解来确保修改直接影响数据库,从而绕过缓存。具体做法如下:
entitymanager.flush();
或
@Modifying @Query("UPDATE WmsLastTime SET orderNo = :orderNo WHERE id = :id") void updateOrderNo(@Param("orderNo") String orderNo, @Param("id") Long id);
以上就是JPA查询同一个对象为何修改会相互影响?的详细内容,更多请关注其它相关文章!