我有一个与更新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中的更改?