@Cacheput不适用于仅更新的插入

时间:2018-02-02 18:02:51

标签: java spring caching redis lettuce

以下是我的代码段。 @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>

我确实验证了要更新的对象的哈希码和第一次保存时插入的对象,它们是不同的。

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。我的save方法位于用

注释的DAO类中
  

@Transactional

。虽然数据库提交正在进行,但Redis提交并未发生,直到整个全局事务成功提交。所以我添加了

  

@Transactional(传播= Propagation.REQUIRES_NEW)

使用@cacheput方法在我所有的Dao类中使用事务性注释来解决我的问题。我知道考虑到两阶段提交可能遇到的问题,在DAO方法上添加它是一个坏主意。但在我目前的用例中,这不是问题。