代码之家  ›  专栏  ›  技术社区  ›  Surya Pratap Singh

Spring Boot Data JPA-更新查询不工作-一级缓存

  •  0
  • Surya Pratap Singh  · 技术社区  · 2 年前

    我有一个与更新JPQL查询相关的问题。运行查询后,我不会通过提供JPA读取API来获得更新的行值。对我来说,这似乎是JPA中与缓存相关的问题。

    原始JPA存储库

    public interface WalletRepository extends JpaRepository<Wallet, Integer> {
    
        Wallet findByWalletId(Integer id);
    
        @Modifying
        @Transactional
        @Query("UPDATE Wallet w SET w.amount = :amount WHERE w.walletId = :walletId")
        void updateWalletAmount(@Param("amount") Double newWalletAmount, @Param("walletId") Integer walletId);
    }
    

    假设我在钱包中有一排{walletId=1,amount=500}

    在我运行以下代码序列之后

    updateWalletAmount(300, 1);
    Wallet wallet = walletRepository.findByWalletId(1);
    System.out.println(wallet.getAmount()); 
    // Print: 500, It should print : 300
    

    我尝试和研究的事情

    所以我发现了一个类似的问题,它谈论的是类似的问题和那里提到的解决方案是使用 flushAutomatically clearAutomatically 使用@Modifying annotation,它基本上要做的是强制实体管理器将所有脏的实体更改写入DB,然后清除持久性缓存。所以我再次运行findneneneba API,实体将从DB中获得更新的值。 你可以在这里检查问题: Spring Boot Data JPA - Modifying update query - Refresh persistence context

    这种方法的问题是,如果在事务的整个生命周期中的任何时候,DB读写出现任何问题,我不希望事务中的任何DB更改都反映在DB中。所以,如果事务失败,我希望所有的更改都能被清除,而不需要将它们写入DB。但在这种方法中,我已经在更新时强制DB中的更改。若以后的事务失败,那个么这些更改已经在DB中了。

    期望

    我想知道在JPA中是否有一种方法可以更新实体的值,使其在持久性上下文中更新,并且在事务完成之前不刷新DB中的更改?

    0 回复  |  直到 2 年前