以下是我的代码段。 @cacheput仅在第一次调用时将数据插入redis。不会在第二次调用save函数时更新该值。引用中的CacheManager是RedisCacheManager。
@CachePut(cacheNames = "User", key = "#user.Id")
@Override
public Optional<User> save(User user) {
if(em.contains(user) || user.isPersisted()) { // merge if exists
User retVal = em.merge(user);
retVal.setPersisted(true);
System.out.println("hashCode after merge-->"+retVal.hashCode());
return Optional.ofNullable(retVal);
} else {
em.persist(user);
user.setPersisted(true);
return Optional.ofNullable(user);
}
}
正在使用的依赖关系:
<dependency>
<groupId>biz.paluch.redis</groupId>
<artifactId>lettuce</artifactId>
<version>4.3.2.Final</version>
</dependency>
我确实验证了要更新的对象的哈希码和第一次保存时插入的对象,它们是不同的。
答案 0 :(得分:0)
我发现了这个问题。我的save方法位于用
注释的DAO类中@Transactional
。虽然数据库提交正在进行,但Redis提交并未发生,直到整个全局事务成功提交。所以我添加了
@Transactional(传播= Propagation.REQUIRES_NEW)
使用@cacheput
方法在我所有的Dao类中使用事务性注释来解决我的问题。我知道考虑到两阶段提交可能遇到的问题,在DAO方法上添加它是一个坏主意。但在我目前的用例中,这不是问题。