JPA查詢同一個對象為何修改會相互影響?

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);

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享