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